格式
参考:https://segmentfault.com/a/1190000040633213
https://csiflabs.cs.ucdavis.edu/~ssdavis/50/att-syntax.htm
https://sdasgup3.github.io/Intel_Vs_Att_format/
AT&T语法格式,Intel语法格式
常见的汇编器有:
GAS (GNU Assembler),使用AT&T语法格式
MASM (Microsoft Macro Assembler),使用Intel语法格式
NASM (Netwide Assembler),使用的语法格式与Intel类似,但是更简单
FASM (Flat Assembler)
寄存器名
AT&T 中寄存器名要加前缀%,而 Intel 则不需要。例如:
pushl %eax # AT&T 格式
push eax # Intel 格式
立即操作数
AT&T 中用$前缀表示一个立即数,而 Intel 不用带任何前缀。例如:
pushl $1 # AT&T
push 1 # Intel
操作方向
AT&T 与 Intel 中的源操作数和目标操作数的位置正好相反。
AT&T 目标操作数在源操作数的右边,Intel 目标操作数在源操作数的左边。例如:
addl $1,%eax # AT&T
add eax,1 # Intel
注意mov命令是反过来的
AT&T Syntax
movl $1,%eax
movl $0xff,%ebx
int $0x80
Intel Syntax
mov eax,1
mov ebx,0ffh
int 80h
常见命令
lea
lea是“load effective address”的缩写,简单的说,lea指令可以用来将一个内存地址直接赋给目的操作数,例如:lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax。而mov指令则恰恰相反,例如:mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。
leave
在32位汇编下相当于:
mov esp,ebp; //将ebp指向的值赋给esp
pop ebp