x86 XOR操作码差异

Mav*_*ick 4 x86 assembly bit-manipulation xor opcode

http://ref.x86asm.net/coder32.html我发现两个匹配语句的操作码

xor eax,eax

1)操作码31 XOR r/m16/32 r16/32

2)操作码33 XOR r16/32 r/m16/32

两者都指操作数1和操作数2的32位寄存器.那么,XORing两个32位寄存器的这种特殊情况有什么不同吗?

Pet*_*des 5

x86有2种冗余方式来编码具有r/m源和r/m目标形式的任何基本ALU指令的2寄存器实例.

这种冗余是x86机器代码如何为大多数指令提供内存目的地或内存源的结果:不是花费在ModR/M字节中的位来对两个操作数进行灵活编码,只需要两个单独的操作码最多指示.

(这就是为什么两个显式的存储器操作数,例如xor [eax], [ecx],不允许任何指令.只有少数指令,其中一个或两个存储器操作数是隐式的,像rep movspush [mem]允许两个存储器操作数,从来没有一个指令具有两个单独的ModR/M编码寻址模式.)


对于reg,reg指令,它们在我知道的任何CPU上的解码和执行方式没有区别; 您需要关心汇编程序使用哪种编码的唯一时间是您希望机器代码满足其他一些要求,例如仅使用表示可打印ASCII字符的字节.(例如,对于漏洞利用有效载荷).

一些汇编程序具有覆盖其默认编码选择的语法,例如GAS具有.s后缀以获得非默认编码.现在已弃用,您应该在助记符之前使用{load}或使用{store}前缀(请参阅文档),如下所示:

{load} xor %eax, %ecx
{store} xor %eax, %ecx
{vex3} vpaddd %xmm0, %xmm1, %xmm1
vpaddd %xmm0, %xmm1, %xmm1        # default is to use 2-byte VEX when possible
Run Code Online (Sandbox Code Playgroud)

gcc -c foo.S && objdump -drwC foo.o

0:   31 c1                   xor    %eax,%ecx
2:   33 c8                   xor    %eax,%ecx
4:   c4 e1 71 fe c8          vpaddd %xmm0,%xmm1,%xmm1
9:   c5 f1 fe c8             vpaddd %xmm0,%xmm1,%xmm1
Run Code Online (Sandbox Code Playgroud)

(相关:可以使用哪些方法在现代x86上有效地扩展指令长度?对于用例{vex3},{evex}{disp32}.)


NASM也有{vex2},{vex3}{evex}前缀使用与GAS相同的语法:{vex3} vpaddd xmm1, xmm1, xmm0.但我不明白的方式来覆盖op r/m, rop r, r/m选择的操作码.


归档时间:

查看次数:

429 次

最近记录:

7 年,5 月 前