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中如何工作?我找不到任何相关文件。
答案 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前缀进行编码。