(1)在AT&T汇编格式(Linux汇编)中,寄存器需要加上“%”作为前缀,而Intel汇编则不用;
AT&T格式 Intel格式
pushl %eax push eax
(2)在AT&T汇编格式(Linux汇编)中,用‘$’前缀表示一个立即操作数,而Intel汇编则不用;
AT&T格式 Intel格式
pushl $1 push 1
(3)AT&T和Intel格式中的源操作数和目标操作数的位置正好相反。在Intel汇编格式中,目标操作数在源操作数的左边;
而在AT&T汇编格式中,目标操作数在源操作数的右边;
AT&T格式 Intel格式
addl $1,%eax add eax,1
(4)在AT&T汇编中,操作数的字长由操作符的最后一个字母决定,后缀‘b’,'l'分别表示操作数为字节、字、和双字,而在Intel汇编格式中,
操作数的字长是用”byte ptr“和“word ptr”等前缀来表示的。
AT&T格式 Intel格式
movb val,%al mov al,byte ptr val
(5)在AT&T中,绝对转移和调用指令(jump/call)的操作数前要加上‘*’作为前缀,而Intel中则不用;
(6)远程转移指令和远程调用指令的操作码,在AT&T汇编格式中为”ljump“和”lcall“,而在Intel中则为”jmp far“和”call far“,即
AT&T格式 Intel格式
ljump $section,$offset jmp far section:offset
lcall $seciton,$offset call far section:offset
与之相应的远程返回指令则为:
AT&T格式 Intel格式
lret $stack_adjust ret far stack_adjust
(7)在AT&T汇编格式中,内存操作数的寻找方式为:
section:disp(base,index,scale)
而在Intel汇编格式中,内存操作数的寻址方式为:
section:[base+index*scale+disp]
在linux工作在保护模式下,用的是32位线性地址,所以在计算地址时不考虑段基址和偏移量,而采用如下的地址计算方式
disp+base+index*scale