AT&T汇编格式介绍

时间:2022-09-23 03:15:41

AT&T汇编格式主要用在Unix/Linux系统中,但是国内计算机课主要是以Intel汇编为主,其实这两种汇编只是语法格式不同而已,只要知道了两者的区别,有Intel汇编基础的人能很快的看懂AT&T汇编代码。下面是两种汇编主要的区别:

1.  操作数大小

AT&T中会在指令结尾用一个字母来表示操作数大小。其中:“b”表示byte;“w”表示word;“l ”表示long。

Intel只是在处理内存操作数时加上BYTE PTR、WORDPTR、DWORD PTR的前缀。

例如:

AT&T                     Intel

movl % eax, %ebx        movebx, eax

movl (% ebx), %eax     mov eax, dword ptr [ebx]

2.  操作数方向

AT&T中第一个操作数为源操作数,第二个操作数为目的操作数。

INTEL则相反,第一个是目的操作数,第二个是源操作数。

例如:

AT&T                             Intel

movl % eax, %ebx              mov ebx, eax

3.  寄存器表示法

AT&T 中使用寄存器要在名称前加‘%’号。

Intel 中则不需要。

例如:

AT&T                    Intel

movl % eax, %ebx      mov ebx, eax

4. 立即数和符号表示法

AT&T 中使用立即数和符号要在前面加‘$’号。

Intel 中则不需要。

例如:

AT&T                     Intel

movl $5, %eax          mov eax, 5

5. 寄存器间址表示法

AT&T 中用于表示地址的寄存器放在 “()”中,

Intel则放在“[]”。

例如:

AT&T                                      Intel

movl -4(ebp), %eax                       moveax, [ebp-4]

movl array(% ebx, % eax, 4), %ecx       mov ecx, [ebx + 4*eax + array]

6.  跳转指令

AT&T中跳转指令和子过程调用指令的操作码带有前缀“l“,分别为ljmp,lcall,lret。

例如:

AT&T                             Intel

ljump0x400400                 jmp 0x400400

lcall0x4003e0                   call0x4003e0

lret                             ret

7.  长跳转指令

AT&T 中长跳转的格式和Intel有区别。

例如:

AT&T                                Intel

ljump 0x3f3e,0x400400             jmp far 0x3f3e:0x400400

lcall 0x3f3e,0x4003e0              callfar 0x3f3e:0x4003e0