What is the purpose of XORing a register with itself?

xor eax, eax will always set eax to zero, right? So, why does MSVC++ sometimes put it in my executable's code? Is it more efficient that mov eax, 0?

012B1002  in          al,dx
012B1003  push        ecx
int i = 5;
012B1004  mov         dword ptr [i],5
return 0;
012B100B  xor         eax,eax

Also, what does it mean to do in al, dx?

97766 次浏览

xor eax, eax是将 eax设置为零的一种更快的方法。之所以会发生这种情况,是因为返回的值为零。

in指令使用 I/O 端口进行操作。基本上是从指定 dx的端口读取一个字的数据,并将其存储在 al中。目前还不清楚为什么会发生在这里。这里有一个 参考文献,似乎解释了它的细节。

是的,这样更有效率。

操作码比 mov eax, 0短,只有2个字节,处理器识别特殊情况并将其作为一个 mov eax, 0处理,没有对 eax的错误读依赖,因此执行时间是相同的。

XOR 操作的确非常快。如果结果是将一个寄存器设置为零,编译器通常会以它所知道的最快的方式来完成。像 XOR 这样的位操作可能只需要一个 CPU 周期,而复制(从一个寄存器到另一个寄存器)只需要很少的一部分。

在不同的目标 CPU 架构下,编译器编写者通常会有不同的行为。

还避免了编译时使用0作为外壳程序代码利用缓冲区溢出等。为什么要避开0?在 c/c + + 中,0表示字符串的结尾,如果利用的平均值是字符串处理函数或类似的函数,则 shell 代码将被截断。

顺便说一下,我指的是最初的问题: “为什么要做一个“ xor eax,eax”而不是 MSVC + + 编译器所做的。

由于在评论中有一些关于这在现实世界中如何相关的争论,请参阅 这篇文章维基百科的这一部分。

使用 XOR reg, regXORPS reg, reg的另一个原因是打破依赖链,这使得 CPU 能够更有效地优化汇编命令的并行执行(即使它增加了一些指令吞吐量压力)。

Xor 通常用于加密代码,例如

      mov eax,[ecx+ValueHere]
xor eax,[ecx+ValueHere]
mov [ebx+ValueHere],esi
xor esi,[esp+ValueHere]
pop edi
mov [ebx+ValueHere],esi

XOR 指令使用逻辑排斥或记住 OR 使用包含 OR 连接两个值要更好地理解 XOR,请考虑这两个二进制值:

      1001010110
0101001101

如果对它们进行 OR,则结果为1100011011当两个位彼此顶部相等时,结果位为0。否则,结果位为1。可以使用 calc.exe 计算 XOR。

从 OP > 任何理由做“ xor eax,eax” 报税表0; 012B100B Ret < —— OP 没有显示这个

XOR EAX,EAX 只是从 EAX 寄存器中输出0,它的执行速度比 MOV EAX,$0,并且不需要立即获取0的数据来加载到 EAX

很明显,这就是 MSVC 正在优化的“返回0” EAX 是 MSVC 中用于从函数返回值的寄存器