【问题标题】:x86-64 assembly order of operandsx86-64 操作数的组装顺序
【发布时间】:2019-06-13 09:00:59
【问题描述】:

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

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

【问题讨论】:

  • 实际上,它可以根据您使用的汇编程序而有所不同。有两种通用标准 IntelAT&T。关于哪个“更好”的争论频繁。
  • 例如对于 AT&T 它是 cmd source, dest 而对于 Intel 它是 cmd dest, source 所以它依赖于汇编程序。
  • @DavidWohlferd:我认为主要的争论通常是 AT&T 语法是否可用/是否可以忍受是否完全。我看到很少有人声称它更好。人们通常声称的最多的是它并没有更糟,你可以习惯它,至少与像 NASM 这样的良好一致的汇编器相比。很难捍卫一个字面上有设计错误的语法(fsubrfsub 对于某些寄存器寄存器操作数被反转。sourceware.org/binutils/docs/as/i386_002dBugs.html)。除了 x87 以外,在我的大脑进入 AT&T 模式后,我对它没有任何问题。

标签: assembly x86-64 att intel-syntax


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2020-04-30
  • 2020-07-23
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多