【高级C】GNU C/C++ 内联汇编——Intel与ATT汇编语法对比

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解

GNU C/C++ 内联汇编——Intel与ATT汇编语法对比

GCC采用的是AT&T的汇编格式, 也叫GAS格式(Gnu ASembler GNU汇编器), 而微软以及Intel 文档采用Intel的汇编格式。

寄存器命名规则不同

  • AT&T 汇编格式中,寄存器名要加上 ‘%’ 作为前缀;
  • Intel 汇编格式中,寄存器名不需要加前缀。
AT&TIntel
%ecxecx

源和目的操作数顺序不同

AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反

  • AT&T 汇编格式中,目标操作数在源操作数的右边;
  • Intel 汇编格式中,目标操作数在源操作数的左边。
AT&TIntel
movl %eax,%ecxmov ecx,eax

常数/立即数的格式不同

  • 在 AT&T 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;对于一个十六进制立即数需要前置’0X’
  • Intel 汇编格式中,立即数的表示不用带任何前缀。二进制数要后置’B’,十六进制数要后置’H’
AT&TIntel
movl $2,%eaxmov eax,2
int $0x80int 80h

操作数长度标识不同

  • AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀’b’、‘w’、‘l’、‘q’ 分别表示操作数为字节(byte,8 比特)、字(word,16 比特)、长字(long,32比特)、四字(long long,64比特);
  • Intel 汇编格式中,操作数的字长是用 “byte ptr” 、 “word ptr” 、"dword ptr"和"qword ptr"前缀来表示字节、字、双字和四字。
AT&TIntel
movl %eax,%ecxmov ecx,dword ptr [eax]

寻址格式不同

以寻址结果为 “base + index*scale + displacement” 为例:

  • AT&T 汇编格式中,寻址格式是 “displacement(base,index,scale)”;
  • Intel 汇编格式中,寻址格式是 “[base + index*scale + displacement]” 。
AT&TIntel
movl -4(%ebp), %eaxmov eax, [ebp - 4]
movl array(, %eax, 4), %eaxmov eax, [eax*4 + array]
movw array(%ebx, %eax, 4), %cxmov cx, [ebx + 4*eax + array]
movb $4, %fs:(%eax)mov fs:eax, 4

跳转指令不同

绝对转移和调用指令

  • AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上 ‘$’ 作为前缀;
  • Intel 格式中不需要。

远程跳转指令和远程调用指令/远程返回指令

  • AT&T 汇编格式中为 “ljump” 和 “lcall”、“lret” ;
  • Intel 汇编格式中则为 “jmp far” 和 “call far”、“ret far”。
AT&TIntel
ljump $section, $offsetjmp far section:offset
lcall $section, $offsetcall far section:offset
lret $stack_adjustret far stack_adjust

这里是从善若水的博客,感谢您的阅读⌨🖥🖱


文章链接

《GNU C/C++ 内联汇编编程指南全集》
《GNU C/C++ 内联汇编——入门级》
《GNU C/C++ 内联汇编——进阶——语法详解》
《GNU C/C++ 内联汇编——进阶——约束详解》
《GNU C/C++ 内联汇编——补充介绍》
《GNU C/C++ 内联汇编——实例参考》
《GNU C/C++ 内联汇编——Intel与ATT汇编语法对比》



在这里插入图片描述


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

从善若水

原创不易,感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值