x86-64操作数的汇编顺序

时间:2019-01-19 07:48:59

标签: assembly x86-64 att intel-syntax

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

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

1 个答案:

答案 0 :(得分:4)

这取决于汇编程序的语法。通常,我们有两个选择:Intel和AT&T语法。

Intel语法有多种形式,主要的是NASM(mov dword [symbol_name], 1)和MASM(包括许多GNU和Unix工具可以使用的GAS的.intel_syntax noprefix模式。)请参阅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指令(如fsubfsubr)的设计错误,并带有寄存器操作数:请参见手册:https://sourceware.org/binutils/docs/as/i386_002dBugs.html