AT&T汇编语言总结

AT&T汇编语言总结

GCC,也就是GNU C Compiler for Linux,使用的是AT&T/UNIX汇编语言的语法,与我们上课学到的x86有很大不同,主要有以下几点:

源-目标的顺序

AT&T语法中操作数的顺序与Intel的相反。Intel语法中第一个操作数为目标(寄存器,内存地址),第二个操作数为源(寄存器,内存地址),而AT&T语法中以第一个操作数为源,第二个操作数为目标。
Intel:

Op-code dst src

AT&T:

Op-code src dst

寄存器名称

寄存器名称要加%前缀。例如,使用eax寄存器时,要写%eax。

立即数操作数

立即数操作数要加$前缀。Intel语法中,十六进制数需要加h后缀,而AT&T语法中需要加0x前缀。

变量加$前缀得到的是该变量的内存地址,不加则是它的值。

操作数位数

AT&T语法中,操作数的位数由opcode的最后一位决定。后缀’b’,’w’,’l’分别表示8位,16位,32位。
Intel:

mov al, byte ptr foo

AT&T:

movb foo, %al

内存寻址

Intel:

section:[base + index*scale + disp]

AT&T:

section:base(offset, index, scale)

offset和index必须为寄存器。上式表示的内存地址为 physical address=base+offset+indexscale

两种语法对照

Intel CodeAT&T Code
mov eax, 1movl $1, %eax
mov ebx, 0ffhmovl $0xff, %ebx
int 80hint $0x80
mov ebx, eaxmovl %eax, %ebx
mov eax, [ecx]movl (%ecx), %eax
mov eax, [ebx + 3]movl 3(%ebx), %eax
mov eax, [ebx + 20h]movl 0x20(%ebx), %eax
add eax, [ebx + ecx * 2h]addl (%ebx, %ecx, 0x2), %eax
lea eax, [ebx + ecx]leal (%ebx, %ecx), %eax
sub eax, [ebx + ecx * 4h - 20h]subl -0x20(%ebx, %ecx, 0x4), %eax

先写这么多。如有错误,还请指正。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值