Rus*_*lan 5 x86 assembly gnu-assembler objdump intel-syntax
GNU汇编程序似乎有一些方法可以控制为某些指令发出的操作码的替代形式.例如
.intel_syntax noprefix
mov eax, ecx
mov.s eax, ecx
Run Code Online (Sandbox Code Playgroud)
处理上面的代码as test.s -o test.o && objdump -d test.o -M intel
给出了以下反汇编:
0: 89 c8 mov eax,ecx
2: 8b c1 mov eax,ecx
Run Code Online (Sandbox Code Playgroud)
我们可以看到.s
后缀似乎将89
操作码切换到8b
版本(并适当地更改了ModRM字节).
这种语法在GAS中如何工作?我找不到任何相关文件.
从 Binutils 2.29 开始,指令后缀现已被弃用,取而代之的是伪前缀。您可以在 GNU 汇编程序(2.29 之前)信息页面中找到记录的旧后缀。前面的info as
页面是这样说的:
\n\n\n9.15.4.1 指令命名
\n\n[剪]
\n\n可以通过可选的助记符后缀指定不同的编码选项。当从一个寄存器移动到另一个寄存器时, .s后缀在编码中交换 2 个寄存器操作数。.d8或.d32后缀在编码时更喜欢 8 位或 32 位位移。
\n
为了记录新的伪前缀,Binutils 2.29(及更高版本)info as
页面被修改为:
\n\n可以通过伪前缀指定不同的编码选项:
\n\n\n
\n- {disp8} \xe2\x80\x93 更喜欢 8 位位移。
\n- {disp32} \xe2\x80\x93 更喜欢 32 位位移。
\n- {load} \xe2\x80\x93 更喜欢加载形式指令。
\n- {store} \xe2\x80\x93 更喜欢存储形式的指令。
\n- {vex2} \xe2\x80\x93 更喜欢 VEX 指令的 2 字节 VEX 前缀。
\n- {vex3} \xe2\x80\x93 更喜欢 VEX 指令的 3 字节 VEX 前缀。
\n- {evex} \xe2\x80\x93 使用 EVEX 前缀进行编码。
\n