Linux内核汇编语法

GNU的汇编器gas是Linux系统中常用的汇编器,它遵循AT&T汇编语法规范。由于Linux内核基于GNU工具链进行开发,所以内核中的汇编也遵循该语法。

一、常规汇编语法

1.1 寄存器前缀

如需访问寄存器,在寄存器名字前加前缀%即可。如

movl $1234ffff, %eax

1.2 立即数前缀

如需使用立即数,在立即数前加前缀$即可。如

movl $1234ffff, %eax

当前缀$使用在变量名称之前时,表示引用该变量的地址。如:

扫描二维码关注公众号,回复: 1342269 查看本文章

var:
    .word 0xA5
    movl $var, %eax

将数据0xA5的地址放入了寄存器eax。

1.3 操作数顺序

在AT&T汇编中,源操作数在前,目的操作数在后。这个和Intel汇编语法正好相反。如

movl %eax, %ebx

表示将寄存器eax的内容传送到寄存器ebx。

1.4 操作数宽度

在AT&T汇编中,每条汇编指令的操作码的后缀b、w、l分别表示操作数的宽度为1、2、4字节。如:

movb %al, %bl
movw %ax, %bx
movl %eax, %ebx

1.5 内存寻址格式

在AT&T汇编中,对于内存寻址可用通用的模板。如:

movw disp(base, index, scale), %ax

表示将base+index*scale+disp指向的内存单元的字节数据传送到寄存器%ax中。

其中base必不可少;index、scale可有可无,但必须同时出现;disp也可有可无。

猜你喜欢

转载自mjt0704.iteye.com/blog/1165037