高级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&T | Intel |
---|---|
%ecx | ecx |
源和目的操作数顺序不同
AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。
- AT&T 汇编格式中,目标操作数在源操作数的右边;
- Intel 汇编格式中,目标操作数在源操作数的左边。
AT&T | Intel |
---|---|
movl %eax,%ecx | mov ecx,eax |
常数/立即数的格式不同
- 在 AT&T 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;
- Intel 汇编格式中,立即数的表示不用带任何前缀。
AT&T | Intel |
---|---|
movl $2,%eax | mov eax,2 |
操作数长度标识不同
- AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀’b’、‘w’、‘l’ 分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);
- Intel 汇编格式中,操作数的字长是用 “byte ptr” 和 “word ptr” 等前缀来表示的。
AT&T | Intel |
---|---|
movl %eax,%ecx | mov ecx,eax |
寻址格式不同
以寻址结果为 “base + index*scale + displacement” 为例:
- AT&T 汇编格式中,寻址格式是 “displacement(base,index,scale)”;
- Intel 汇编格式中,寻址格式是 “[base + index*scale + displacement)” 。
AT&T | Intel |
---|---|
movl -4(%ebp), %eax | mov eax, [ebp - 4] |
movl array(, %eax, 4), %eax | mov eax, [eax*4 + array] |
movw array(%ebx, %eax, 4), %cx | mov 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&T | Intel |
---|---|
ljump $section, $offset | jmp far section:offset |
lcall $section, $offset | call far section:offset |
lret $stack_adjust | ret 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汇编语法对比的主要内容,如果未能解决你的问题,请参考以下文章