GNU汇编程序x86指令后缀如“mov.s”中的“.s”如何工作?

时间:2017-12-06 11:25:50

标签: assembly x86 gas

GNU汇编程序似乎有一些方法可以控制为某些指令发出的操作码的替代形式。 E.g。

.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中如何工作?我找不到任何相关文件。

1 个答案:

答案 0 :(得分:3)

从Binutils 2.29开始,指令后缀现在是deprecated,有利于伪前缀。您可以找到GNU汇编程序(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前缀进行编码。
  •