att与intel风格对照实例

本文对比了AT&T和Intel两种不同的汇编语言风格,并通过实际代码示例展示了两者之间的主要区别。对于习惯Intel风格但需要阅读AT&T风格代码的开发者来说,了解这些差异尤为重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

估计很多朋友都和我一样,多年来习惯intel的汇编风格。可是难免遇到风格炯异的att代码。怎么办?顶着上吧!

怎么上?个人觉得有intel汇编基础的朋友不必循常规专门去学习att,去查att手册。用gdb使用两种风格反汇编同一段代码,对照一看就能明白其中的差异。

gdb中有两个命令用于查询和切换反汇编的显示风格

查询当前反汇编格式:show disassembly-flavor

设置反汇编格式为intel(att):set disassembly-flavor intel(att)

下面实例一段代码对照两种风格

  att                 intel

push  %ebp          push  ebp          ;att寄存器名前加%

mov   %esp,%ebp       mov  ebp,esp        ;源操作数与目的操作数顺序与intel相反

sub   %0x68,%esp      sub  esp,0x68        ;分配0x68字节的局部变量空间

;下面是带偏移地址的寄存器间接寻址,[]变(),偏移写在括号外面。

;偏移可以为负。比如 mov -0x10(%ebp),%eax 相当于 mov eax,DWORD PTR[ebp-10]

mov  0x10(%ebp),%eax    mov  eax,DWORD PTR [ebp+0x10]

mov  %eax,-0x48(%ebp)   mov  DWORD PTR [ebp-0x48],eax  ;将参数赋值给局部变量

...

;att里的l,w,b用来表达操作属性的限定符,l是长字节(4字节), w是双字节,b是单字节.

;加在命令的后边,相当于intel中的dword ptr,word ptr,byte ptr

;att里立即数前要加$,如下面的$0x0

movl  $0x0,-0x28(%ebp)   mov  DWORD PTR [ebp-0x28],0x0
 
...

call   0x406c4c         call    0x406c4c  ;不变

...

leave               leave         ;不变

ret                ret           ;不变

转载于:https://www.cnblogs.com/billin/archive/2011/09/28/2194214.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值