Assembly x86-64操作数的汇编顺序

Assembly x86-64操作数的汇编顺序,assembly,x86-64,att,intel-syntax,Assembly,X86 64,Att,Intel Syntax,x86-64汇编中的操作数顺序是什么 指令目的地、源 或: 指令源、目的地 我有三本书和两种不同的方法 这取决于汇编程序的语法。我们通常有两种选择:英特尔和AT&T语法 英特尔语法有多种风格,主要有NASM(mov dword[symbol_name],1)和MASM(包括GAS的。许多GNU和Unix工具都可以使用英特尔语法noprefix模式)。有关差异的详细信息,请参阅 英特尔语法示例(来自objdump反汇编,因此这是GNU.Intel_syntax,其中添加了几个示例): AT&T语法

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


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

这取决于汇编程序的语法。我们通常有两种选择:英特尔和AT&T语法

英特尔语法有多种风格,主要有NASM(
mov dword[symbol_name],1
)和MASM(包括GAS的
。许多GNU和Unix工具都可以使用英特尔语法noprefix
模式)。有关差异的详细信息,请参阅

英特尔语法示例(来自objdump反汇编,因此这是GNU
.Intel_syntax
,其中添加了几个示例):

AT&T语法()只有一种味道:

AT&T语法是Unix系统的固有语法。通常,反编译器具有控制输出语法类型的标志。例如,
objdump
-Mintel
标志,gdb有
设置反汇编风格英特尔
选项

另外,看看这个有用的站点,在这个站点上您可以快速地看到汇编程序的输出,而不会产生噪音



请注意,AT&T语法对于x87非交换FP指令(如带有寄存器操作数的
fsub
fsubr
)存在设计缺陷:请参阅手册:

实际上,它可能会根据您使用的汇编程序而有所不同。英特尔和AT&T有两个共同的标准。关于哪一个“更好”存在着频繁的争论。例如,对于AT&T来说,它是
cmd source,dest
,而对于英特尔来说,它是
cmd dest,source
,因此它依赖于汇编程序。@DavidWohlferd:我认为主要的争论通常是AT&T语法是否可用/可承受。我很少看到有人说它更好。人们通常说的最重要的一点是,它并不糟糕,而且您可以习惯它,至少与像NASM这样的好的一致性汇编程序相比。很难为一种确实存在设计缺陷的语法辩护(对于某些寄存器操作数,
fsubr
fsub
相反)。除了x87,我的大脑进入AT&t模式后,它没有任何问题。如果您获得的是asm输出而不是机器代码(),编译器也有选项。gcc/clang/icc
-masm=intel
。此外,诸如GNU assembler之类的unix汇编器可以动态切换语法,请参见例如关于“如何”和实际用法。
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
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