AT&T 格式和 Intel 格式是两种主流的汇编语言语法风格,而 NASM 是一个广泛使用的汇编器,支持 Intel 语法。以下是它们的对比和关键区别:
1. AT&T 格式 vs Intel 格式
(1) 操作数顺序
-
AT&T:
源操作数在前,目标操作数在后
movl %eax, %ebx # 将 eax 的值复制到 ebx
-
Intel:
目标操作数在前,源操作数在后
mov ebx, eax # 将 eax 的值复制到 ebx
(2) 寄存器与立即数表示
-
AT&T:
- 寄存器前加
%
:%eax
,%ebx
- 立即数前加
$
:$42
,$0x80
addl $10, %eax # eax += 10
- 寄存器前加
-
Intel:
- 寄存器直接写:
eax
,ebx
- 立即数无前缀:
42
,80h
add eax, 10 # eax += 10
- 寄存器直接写:
(3) 操作数大小
-
AT&T: 通过指令后缀表示操作数大小:
-
b
(byte, 8位) -
w
(word, 16位) -
l
(long, 32位) -
q
(quad, 64位)
movw %ax, %bx # 16位移动
-
-
Intel: 通过操作数或关键字(如
BYTE PTR
)指定大小:mov bx, ax # 16位移动 mov BYTE PTR [eax], 0x80
(4) 内存引用
-
AT&T: 用
()
表示内存地址,偏移量写在括号外:movl 4(%eax), %ebx # ebx = *(eax + 4)
-
Intel: 用
[]
表示内存地址,偏移量写在括号内:mov ebx, [eax + 4] # ebx = *(eax + 4)
(5) 其他差异
- AT&T 更常见于 Unix/Linux 系统(如 GCC 内联汇编)。
- Intel 更常见于 Windows、MASM、NASM 和官方文档(如 Intel 手册)。
2. NASM 的特点
NASM(Netwide Assembler)是一个跨平台的汇编器,主要特点包括:
- 语法风格: 使用 Intel 语法(与 AT&T 相反)。
- 跨平台: 支持 x86/x86-64,可生成 Linux、Windows 等平台的目标文件。
- 宏支持: 提供强大的宏功能。
-
标签处理: 标号后需加
:
(如label:
),而 MASM 允许省略。
NASM 示例
section .data
msg db "Hello, World!", 0xA ; 定义字符串
len equ $ - msg ; 计算长度
section .text
global _start
_start:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg ; 字符串地址
mov edx, len ; 长度
int 0x80 ; 调用内核
mov eax, 1 ; sys_exit
int 0x80
3. 常见汇编器与语法对照
汇编器 | 默认语法 | 典型使用场景 |
---|---|---|
NASM | Intel | Linux/Windows 跨平台 |
GAS (GCC) | AT&T | Linux 内联汇编 |
MASM | Intel | Windows 开发 |
FASM | Intel | 自举编译、跨平台 |
4. 如何选择?
- 学习/阅读 Intel 手册 → Intel 语法(如 NASM)。
- Linux 内核/驱动开发 → AT&T 语法(GCC 内联汇编)。
- Windows 开发 → MASM 或 NASM(Intel 语法)。
5. 转换示例
同一段代码的两种语法:
; Intel (NASM)
mov eax, [ebx + 8] ; eax = *(ebx + 8)
add ecx, 20 ; ecx += 20
# AT&T (GAS)
movl 8(%ebx), %eax # eax = *(ebx + 8)
addl $20, %ecx # ecx += 20
建议根据工具链和目标平台选择合适的语法。