关于汇编:与自己对寄存器进行异或的目的是什么?

What is the purpose of XORing a register with itself?

本问题已经有最佳答案,请猛点这里访问。

eax零集xor eax, eax永远,好吗?操作系统开发的时候,为什么不把它放进我的+ +可执行的代码。这是更有效的,mov eax, 0吗?

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

另外,in al, dx均对它的是什么?


是的,效率更高。

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


另外,为了避免在编译时使用0,如用于利用shell代码的缓冲区溢出等,为什么要避免0?0表示C/C++中字符串的结尾,如果剥削的平均值是字符串处理函数等,则shell代码将被截断。

顺便问一下,我指的是最初的问题:"有什么理由做一个"xor eax,eax"?不是MSVC++编译器所做的。

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


xor eax, eax是将eax设置为零的更快方法。这是因为你返回零。

in指令正在处理I/O端口。基本上是从指定的端口dx中读取一个字的数据,并将其存储在al中。不清楚为什么会发生在这里。这里有一个参考资料,似乎可以详细解释。


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


XOR操作确实非常快。如果结果是将寄存器设置为零,编译器通常会以它所知道的最快的方式执行。像xor这样的位操作可能只需要一个CPU周期,而一个拷贝(从一个寄存器到另一个寄存器)只需要很少的时间。

在不同的目标CPU体系结构下,编译器编写者通常甚至会有不同的行为。


从操作>执行"xor eax,eax"的任何原因返回0;012B100B异或EAX,EAXret<--op不显示这个

XOREAX,EAX只是0的EAX寄存器,它的执行速度比mov eax,$0,不需要取0的即时数据加载到eax中。

很明显,这是MSVC正在优化的"返回0"eax是用于从MSVC中的函数返回值的寄存器。


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

1
2
3
4
5
6
      mov eax,[ecx+ValueHere]
      xor eax,[ecx+ValueHere]
      mov [ebx+ValueHere],esi
      xor esi,[esp+ValueHere]
      pop edi
      mov [ebx+ValueHere],esi

xor指令使用逻辑异或记住或使用inclusive或更好地理解xor连接两个值,请考虑这两个二进制值:

1
2
      1001010110
      0101001101

如果您或他们,结果是1100011011,当两个位在彼此之上相等时,得到的位是0。否则,结果位为1。可以使用calc.exe计算xor。