x86-64 操作数的汇编顺序

Jos*_*iah 3 assembly x86-64 att intel-syntax

x86-64汇编中操作数的顺序是什么?:指令目标,源或:指令源,目标

我有三本书和两种不同的方法!

fun*_*man 5

这取决于汇编程序的语法。大多数情况下,我们有两种选择:Intel 和 AT&T 语法。

Intel 语法有多种风格,主要是 NASM ( mov dword [symbol_name], 1) 和 MASM(包括.intel_syntax noprefix许多 GNU 和 Unix 工具可以使用的GAS模式。)有关详细信息,请参阅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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

AT&T 语法是 Unix 系统原生的。通常,反编译器具有控制输出语法类型的标志。例如objdump-Mintel标志,gdb 有set disassembly-flavor intel选项。

此外,请查看这个有用的站点,您可以在该站点上快速查看无噪声的汇编器输出Compiler Explorer


请注意 AT&T 语法对于 x87 非可交换 FP 指令(如寄存器操作数fsubfsubr寄存器操作数)存在设计错误:请参阅手册:https : //sourceware.org/binutils/docs/as/i386_002dBugs.html