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:
本文已在图灵出版社社区连载中,欢迎大家前去阅读。
本文详细对比了AT&T汇编与Intel汇编在语法格式、赋值方向、操作数前缀等方面的不同之处,并介绍了锁总线前缀、跳转与调用指令、内存间接寻址格式和指令后缀等内容。
2039

被折叠的 条评论
为什么被折叠?



