在x86-64程序集中操作数的顺序是什么?:指令目的地、源或:指令源、目的地。
我有三本书和两种不同的方法!
发布于 2019-01-19 08:00:59
这取决于汇编程序的语法。大多数情况下,我们有两个选择:intel语法和AT&T att语法。查看它们各自的标记wiki、intel语法和att。
英特尔语法有多种风格,主要有NASM (mov dword [symbol_name], 1)和MASM (包括GAS的.intel_syntax noprefix模式,许多GNU和Unix工具都可以使用)。有关差异和区别的详细信息,请参见Intel语法标记wiki。
Intel语法示例(来自objdump -drwC -Mintel反汇编,因此这是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], 12345AT&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选项。GCC有-masm=intel,它影响内联asm("" :::)语句的组装方式,以及编译器提供给汇编程序的asm。
另外,请看一下这个有用的站点,您可以在这个站点上快速看到汇编程序输出而没有噪音编译器资源管理器。
注意AT&T语法对于x87非交换FP指令有一个设计错误,比如fsub和带有寄存器操作数的fsubr:参见手册:002dBugs.html。
相关信息:
https://stackoverflow.com/questions/54265108
复制相似问题