ATT与Intel汇编代码格式

ATT(根据“AT&T“命名的,AT&T是运营贝尔实验室多年的公司)格式汇编代码,是GCC、OBJDUMP和其他一些工具的默认格式。其他一些编程工具,包括Microsoft的工具,以及来自Intel的文档,其汇编代码都是Intel格式的。

ATT汇编代码:

simple:
    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp), %edx
    movl 12(%ebp), %eax
    addl (%edx), %eax
    movl %eax, (%edx)
    popl %ebp
    ret

Intel汇编格式代码:

simple:
	push ebp
	mov ebp, esp
	mov edx, dword ptr [ebp+8]
	mov eax, dword ptr [ebp+12]
	add eax, dword ptr [edx]
	mov dword ptr [edx], eax
	pop ebp
	ret

区别:

Intel代码省略了指示大小的后缀。如指令mov,不是movl。

Intel代码省略了寄存器名字前面的‘%’符号。用的是esp,而不是%esp。

Intel代码用不同的方式来描述寄存器中的位置。例如,是‘dword ptr [ebp+8]‘而不是’8(%ebp)‘。

Intel立即数(immediate),也就是常数值,不使用前缀’$’,如,十进制数123,不是$123;十六进制数123h,不是$0x123

Intel指令一般使用从右到左的顺序,而ATT使用从左到右,如Intel是 mov dst, src,而ATT是 mov src, dst

AT&T语法中立即数前面加一个字符'$';寄存器操作数名前要加字符百分号'%';绝对跳转/调用(相对于与程序计数器有关的跳转/调用)操作数前面要加星号'*'。而Intel汇编语法均没有这些限制。

AT&T语法与Intel语法使用的源和目的操作数次序正好相反。AT&T的源和目的操作数是从左到右‘源,目的’。例如Intel的语句‘add eax, 4'对应AT&T的’addl &4, %eax'。

AT&T语法中内存操作数的长度(宽度)由操作码最后一个字符来确定。操作码后缀‘b’、‘w’和‘l’分别指示内存引用宽度为8位字节(byte)、16位字(word)和32位长字(long)。Intel语法则通过在内存操作数前使用前缀‘byte prt’、‘word ptr’和‘dword ptr’来达到同样的目的。因此,Intel的语句‘mov al, byte ptr foo’对应于AT&T的语句‘movb $foo, %al’。

AT&T语法中立即形式的远跳转和远调用为‘ljmp/lcall $section, $offset’,而Intel的是‘jmp/call far section:offset’。同样,AT&T语法中远返回指令‘lret $stack-adjust’对应Intel的‘ret far stack-adjust’。

AT&T汇编器不提供对多代码段程序的支持,UNIX类操作系统要求所有代码在一个段中。

 

ATT寻址方式:

ATT与Intel汇编代码格式_第1张图片

Intel寻址方式:

ATT与Intel汇编代码格式_第2张图片

你可能感兴趣的:(汇编语言)