AT&T 与Intel 汇编语法比较

时间:2023-02-06 03:15:28
 任何一个操作系统的源代码中总是少不了汇编语言,因此汇编语言是学习操作系统必备的基础知识,然而目前国内的教学大多是在Windows 平台上进行的,因此大多数读者熟悉的是Intel 的汇编语法,但是在Linux 内核代码中使用的却是AT&T 的汇编。本节对这两种汇编进行对比,让已经熟悉Intel 汇编语法的读者快速掌握AT&T 的汇编。
1. 前缀

        在Intel 汇编语法中,寄存器和立即数都没有前缀,但是在AT&T 的汇编语法中,寄存器的前缀为"%",而立即数的前缀为"$"。两种格式的区别如下例所示:
----------------------------------------------------------------------------
                      代码片段2.1 Intel 与AT&T 汇编格式比较
# EAX <= 8
MOV EAX, 8 (Intel)
movl $8, %eax (AT&T)

# EAX <= EBX
MOV EAX, EBX (Intel)
movl %EBX, %EAX (AT&T)
------------------------------------------------------------------------

2. 操作数方向
        Intel 汇编和AT&T 的操作数方向相反,Intel 汇编中的第一个操作数为目的操作数,而第二个操作数为源操作数,而AT&T 汇编语法中,第一个数为源操作数,第二个数为目的操作数。从上面的例子可以看出它们之间的区别。

3. 操作数位宽
        Intel 汇编中,由特定的字符指定操作数的位宽,例如"BYTE PTR","WORD PTR", "DWORDPTR" 来表示。在AT&T 汇编中,由操作码最后一个字符来指定操作数的位宽,b,w,l 分别代表8 位,16 位,32 位。下面的例子说明了它们的区别:
------------------------------------------------------------------------                代码片段2.2 Intel 与AT&T 汇编格式比较 MOV AL, BYTE PTR BAR (Intel)
movb %al, BAR (AT&T)
------------------------------------------------------------------------

4. 间接寻址方式
         Intel 和AT&T 的间接寻址格式如下所示:
------------------------------------------------------------------------
             代码片段2.3 Intel 与AT&T 汇编格式比较

1 SEGREG:[BASE+INDEX*SCALE+DISP] (Intel)
2 segreg:disp(base, index, scale) (AT&T)
上面的例子是间接寻址的通用形式,为了方便理解,我们举一个例子对这个通用形式
进行解释,假设有下面这样的一个结构体数组:
struct test {
int a;
int b;

  };

struct test bar[10];
------------------------------------------------------------------------
        假设现在要访问数组第6 项中的成员b,使用默认的段寄存器,那么它对应的汇编代
码如下:
------------------------------------------------------------------------              代码片段2.4 Intel 与AT&T 汇编格式比较

# BASE 表示数组基地址,对应本例中的bar。
# INDEX 为数组索引,对应本例中的第6 项,就是51。
# SCALE 是结构体的大小,本例中大小为8 个字节。
# DISP 是结构体内的偏移量,本例中b 的偏移量为4。
MOV EAX, DWORD PTR [bar+5*8+4] (Intel)
movl 4(bar,5,8), %eax (AT&T)
------------------------------------------------------------------------
        从这里可以看出,Intel 语法相对直观,通用形式中的SCALE,INDEX 等都可以为空,例如以下是常见的形式。
------------------------------------------------------------------------               代码片段2.5 Intel 与AT&T 汇编格式比较

MOV EAX, DWORD PTR [ebp+20h] (Intel)
movl 0x20(%ebp), %eax, (AT&T)
------------------------------------------------------------------------
注意:数组下标从0 开始