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

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级CGNU 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 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;
  • Intel 汇编格式中,立即数的表示不用带任何前缀。
AT&TIntel
movl $2,%eaxmov eax,2

操作数长度标识不同

  • AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀’b’、‘w’、‘l’ 分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);
  • Intel 汇编格式中,操作数的字长是用 “byte ptr” 和 “word ptr” 等前缀来表示的。
AT&TIntel
movl %eax,%ecxmov ecx,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汇编语法对比》




以上是关于高级CGNU C/C++ 内联汇编——Intel与ATT汇编语法对比的主要内容,如果未能解决你的问题,请参考以下文章

高级CGNU C/C++ 内联汇编——实例参考

高级CGNU C/C++ 内联汇编——入门级

高级CGNU C/C++ 内联汇编——补充介绍

高级CGNU C/C++ 内联汇编——入门级

高级CGNU C/C++ 内联汇编——进阶——约束详解

高级CGNU C/C++ 内联汇编——进阶——语法详解