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也可有可无。