x86-64汇编中的操作数顺序是什么?: 指令目的地,来源 要么: 指令源,目的地
我有三本书和两种不同的方法!
答案 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指令(如fsub
和fsubr
)的设计错误,并带有寄存器操作数:请参见手册:https://sourceware.org/binutils/docs/as/i386_002dBugs.html