Intel汇编和AT&T汇编的简要区别,生成方法和判断技巧

Intel汇编和AT&T汇编的简要区别,生成方法和判断技巧

@2022年8月19日10:54:22


前缀

AT&T 中 寄存器有前缀 %,立即数有前缀 $

AT&T syntax Intel syntax
movl $1, %eax mov eax, 1

操作方向

AT&T syntax Intel syntax
insn source, destination insn destination, source

内存操作

AT&T 内存寻址使用的是 ()
Intel 内存寻址使用的是 []

AT&T syntax Intel syntax
movl -12(%rbp), %eax mov eax, DWORD PTR -12[rbp]

指令后缀

AT&T 会在指令后面添加(‘b’, ‘w’, ‘l’ 或 ‘q’) 指定操作数的大小
Intel 会在内存操作数上指定 byte ptr, word ptr, dword ptr

AT&T syntax Intel syntax
movl -12(%rbp), %eax mov eax, DWORD PTR -12[rbp]
movq %rsp, %rbp mov rbp, rsp


寻址

AT&T 语法:disp(base, index, scale)
Intel 语法:[base + index*scale + disp]

最终地址为 base + disp + index * scale

AT&T syntax Intel syntax
movl -12(%rbp), %eax mov eax, DWORD PTR -12[rbp]
leaq 0(,%rax,4), %rdx lea rdx, 0[0+rax*8]

​ 这里我也不懂 leaq 0(,%rax,4), %rdx ;lea rdx, 0[0+rax*8]

Intel 格式汇编和 AT&T 格式汇编的生成方法

方法1:先编译成二进制,然后进行反汇编

在 Linux 平台上,objdump 默认输出是 AT&T 的语法格式,可以添加 -M 指定输出的语法格式。

gcc -c test.c				// 先使用 gcc 编译成二进制文件
objdump -d test.o           // 默认输出 AT&T 格式
objdump -M intel -d test.o  // 输出 intel 的语法格式

方法2:直接生成汇编文件

gcc -S test.c				//  默认输出 AT&T 格式
gcc -S -masm=intel test.c	//  输出 intel 的语法格式

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!