这取决于汇编程序的语法。大多数情况下,我们有两种选择:Intel 和 AT&T 语法。
Intel 语法有多种风格,主要的是 NASM (mov dword [symbol_name], 1) 和 MASM(包括 GAS 的 .intel_syntax noprefix 模式,许多 GNU 和 Unix 工具都可以使用。)请参阅 https://stackoverflow.com/tags/intel-syntax/info 了解有关差异的详细信息和区分它们。
Intel 语法示例(来自 objdump 反汇编,所以这是 GNU .intel_syntax,添加了几个示例):
push rbp # comment character can be # (GAS) or ; MASM/NASM
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov DWORD PTR [rbp-0x8],esi
mov edx,DWORD PTR [rbp-0x4]
mov eax,DWORD PTR [rbp-0x8]
add eax,edx
pop rbp
ret
add dword ptr [rdi], 1 # size specifier mandatory if neither operand is a reg
imul ecx, [rdi + rax*4 + 20], 12345
只有一种 AT&T 语法 (https://stackoverflow.com/tags/att/info):
push %rbp # comment character is always #
mov %rsp,%rbp
mov %edi,-0x4(%rbp)
mov %esi,-0x8(%rbp)
mov -0x4(%rbp),%edx
mov -0x8(%rbp),%eax
add %edx,%eax
pop %rbp
retq
addl $1, (%rdi) # size suffix b/w/l/q used to indicate operand-size if neither operand is a register
# with more than 2 operands, reverse the whole list
imul $12345, 20(%rdi, %rax, 4), %ecx
AT&T 语法是 Unix 系统的原生语法。通常,反编译器有标志来控制一种输出语法。例如objdump 有-Mintel 标志,gdb 有set disassembly-flavor intel 选项。
另外,看看这个有用的网站,您可以在该网站上快速查看无噪音的汇编器输出Compiler Explorer
注意 AT&T 语法对于 x87 非交换 FP 指令存在设计错误,例如带有寄存器操作数的 fsub 和 fsubr:请参阅手册:https://sourceware.org/binutils/docs/as/i386_002dBugs.html