5

GNU 汇编器似乎有一些方法可以控制为某些指令发出的操作码的替代形式。例如

.intel_syntax noprefix
mov   eax, ecx
mov.s eax, ecx

处理上面的代码as test.s -o test.o && objdump -d test.o -M intel给出以下反汇编:

0:   89 c8                   mov    eax,ecx
2:   8b c1                   mov    eax,ecx

我们可以看到.s后缀似乎将89操作码切换到8b版本(并适当地更改了 ModRM 字节)。

这种语法在 GAS 中是如何工作的?我找不到任何相关文件。

4

1 回答 1

3

从 Binutils 2.29 开始,指令后缀现已弃用,取而代之的是伪前缀。您可以在 GNU Assembler (pre-2.29) info pages中找到记录的旧后缀。前几info as页这样说:

9.15.4.1 指令命名

[剪辑]

可以通过可选的助记符后缀指定不同的编码选项。当从一个寄存器移动到另一个寄存器时,.s后缀在编码中交换 2 个寄存器操作数。.d8.d32后缀在编码中更喜欢 8 位或 32 位位移。

记录新的伪前缀,Binutils 2.29(及更高版本)info as页面被修改为:

可以通过伪前缀指定不同的编码选项:

  • {disp8} - 更喜欢 8 位位移。
  • {disp32} - 更喜欢 32 位位移。
  • {load} - 更喜欢加载形式的指令。
  • {store} - 更喜欢商店形式的指令。
  • {vex2} – VEX 指令首选 2 字节 VEX 前缀。
  • {vex3} – VEX 指令首选 3 字节 VEX 前缀。
  • {evex} – 使用 EVEX 前缀编码。
于 2017-12-06T17:49:37.327 回答