本人就职于国际知名终端厂商,负责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 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;对于一个十六进制立即数需要前置’0X’
- Intel 汇编格式中,立即数的表示不用带任何前缀。二进制数要后置’B’,十六进制数要后置’H’
AT&T | Intel |
---|---|
movl $2,%eax | mov eax,2 |
int $0x80 | int 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&T | Intel |
---|---|
movl %eax,%ecx | mov ecx,dword ptr [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汇编语法对比》