AT&T 与Intel 汇编语法比较

 任何一个操作系统的源代码中总是少不了汇编语言,因此汇编语言是学习操作系统必备的基础知识,然而目前国内的教学大多是在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 开始
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue_Dream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值