2.1.1 AT&T 汇编 与 Intel 汇编

AT&T汇编与Intel汇编在功能上没有什么太大的区别,但是,在语法格式,赋值方向,前缀等地方却各自有各自的特点。下面我们就开始介绍:

语法格式

  • Intel 汇编

    mov ax, 0x10  
    

注意:在Intel格式中指令需要使用大写字母,但是我们使用的nasm却不需要使用大写字母,有可能是编译器的原因,但是我没有具体验证过,其他的编译器可能会有这方面要求

  • AT&T 汇编

    mov $0x10, %ax  
    

赋值方向

  • Intel 汇编

在Intel语法中,第一个是目的操作数,第二个是源操作数,赋值方向从右向左。
例如:add指令

这是Intel技术文档内对add指令的一部分描述:

Adds the destination operand (first operand) and the source operand (second operand) and then stores the result in the destination operand.

翻译:add指令的目的操作数是第一个操作数,源操作数是第二个操作数,执行的结果会保存到目的操作数里。

  • AT&T 汇编

在AT&T语法中,恰恰与Intel相反,第一个是源操作数,第二个是目的操作数,赋值方向从左向右。

呵呵,是不是有点意思。。~我们的操作系统都用到了这两种汇编语言,同学们要好好学,不要偏科呀。我有时候也容易把这两个语言的赋值方向搞混,所以,你们要格外注意了!!!!

操作数前缀

  • Intel 汇编

在Intel语法中,寄存器和立即数不需要添加前缀。例如:

mov cx, 12
  • AT&T 汇编

在AT&T语法中,如果要使用寄存器的话,需要在前面加前缀“%”;如果要使用立即数的话,需要在前面加“$”。 例如:

mov $12, %cx  

对于符号常数我们可以直接引用,不需要加前缀。例如:

values: .long 0x5a5a5a5a  
movl values, %eax  

在这里,符号values是一个符号常数,执行的结果是将常数0x5a5a5a5a装入寄存器eax中。

如果在符号前面加前缀$,表示引用的是该符号的地址。 例如:

values: .long 0x5a5a5a5a 
movl $values, %ebx  

这句汇编的意思是将values的地址装入ebx寄存器中。

锁总线前缀“lock”,这个lock前缀一般是用在多核CPU上的,它的目的是:锁住系统前端总线,防止其他CPU通过前端总线访问内存或其他系统硬件资源。像Linux的spinlock功能,就有lock的身影。

跳转和调用指令

  • Intel 汇编

远程跳转指令使用的是“jmp”后面跟的是段地址和段内偏移。远程调用指令使用的是“call”后面同样跟的是段地址和段内偏移,远程返回指令使用的是“ret”。

    call far section:offset
    jmp far section:offset  
    ret
  • AT&T 汇编

对于远程跳转指令和远程调用过程的指令码需要使用前缀“l”,分别为“ljmp”和“lcall”,与“lcall”相对应的返回指令时“lret”。例如:

    lcall $section:$offset  
    ljmp $section:$offset  
    lret

内存间接寻址格式

  • Intel 汇编

Intel中基地址使用“[”、“]”来表示间接寻址,格式如下:

    section:[base+index*scale+displacement]

其中segreg,index,scale,disp都是可选的,scale可以取值1,2,4,8。如果不指定scale值,则默认值为1。section可以指定任意的段寄存器作为段前缀。

  • AT&T 汇编

在AT&T中基地址使用“(”、“)”来表示间接寻址,格式如下:

    section:displacement(base,index,scale)  

其中segreg,index,scale,disp与Intel的定义是一样的。

指令的后缀

  • Intel 汇编

Intel中处理内存操作数时需要区分操作数大小,字节:BYTE PTR、字:WORD PTR、双字:DWORD PTR。例如:

mov al, bl
mov ax, bx
mov eax, dword ptr [ebx]
  • AT&T 汇编

AT&T 语法中大部分指令处理内存操作数时需要区分操作数大小,“b”表示byte(一个字节);“w”表示word(2 个字节);“l”表示long(4 个字节)。例如:

movb %bl, %al  
movw %bx, %ax  
movl (%ecx), %eax  

另外,AT&T的跳转指令标号后的后缀表示跳转方向,“f”表示向前(forward),“b”表示向后(back)。例如:

jmp 1f  
1:  
jmp 1f  
1:

本文已在图灵出版社社区连载中,欢迎大家前去阅读。

网址:http://www.ituring.com.cn/minibook/29303

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值