AT&T 和 Intel 汇编语法的主要区别
AT&T 和 Intel 汇编语法的主要区别
October 29, 2011 分类:技术
作为一个爱折腾的大好青年,补番之余还要补一些 Linux 下的基础,比如 GDB 的正确使用方法。但无论是看 gdb
还是 gcc -S
里的汇编,感觉都不能一下子接受这种设定。
后来发现,虽然同为 x86 汇编,但语法也分两大流派:之前上学时学的 Intel 语法,以及流行于 Unix/Linux 平台上的 AT&T 语法。
首先,两者最让人纠结的区别就是源操作数、目标操作数的顺序。AT&T 语法先写源操作数,再写目标操作数;Intel 语法先写目标操作数,再写源操作数:
- AT&T
-
movl %esp, %ebp
- Intel
-
MOV EBP, ESP
然后,另一个明显的区别就是指令的命名(或者说,操作数大小的指定方式)。AT&T 语法将操作数的大小表示在指令的后缀中(b、w、l);Intel 语法将操作数的大小表示在操作数的前缀中(BYTE PTR、WORD PTR、DWORD PTR):
- AT&T
-
decw (%eax)
- Intel
-
DEC WORD PTR [EBX]
再者,各种取址方式的表示。AT&T 语法总体上是offset(base, index, width)
的格式;Intel 语法总体上是[INDEX * WIDTH + BASE + OFFSET]
的格式:
- AT&T
-
movl 0x0100, %eax movl (%esi), %eax movl -8(%ebp), %eax movl 0x0100(,%ebx,4), %eax movl 0x8(%edx,%ebx,4), %eax
- Intel
-
MOV EAX, [0100] MOV EAX, [ESI] MOV EAX, [EBP-8] MOV EAX, [EBX*4+0100] MOV EAX, [EDX+EBX*4+8]
另外,各种非十进制数制下数字的表示方法。AT&T 语法用前缀表示数制(0x、0、0b);Intel 语法用后缀表示数制(h、o、b):
- AT&T
-
movl 0x8 , %eax movl 010 , %eax movl 0b1000, %eax
- Intel
-
MOV EAX, 8h MOV EAX, 10o MOV EAX, 1000b
最后就是零碎的东西的表示方法了。AT&T 语法要在常数前加 $、在寄存器名前加 % 符号;Intel 语法没有相应的东西要加:
- AT&T
-
subl $0x30, %eax
- Intel
-
SUB EAX, 30
于是,以上就是 AT&T 和 Intel 汇编语法的主要区别了……吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程