XOR注册与自己的目的是什么?

xor eax, eax将始终将eax设置为零,对吧? 那么,为什么MSVC ++有时会把它放在我的可执行代码中呢? 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 

另外, in al, dx做什么意思?

是的,这是更高效。

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

还要避免在编译时使用0代表利用shell代码来利用缓冲区溢出等。为什么要避免0? 那么0表示c / c ++中string的结尾,如果开发的意思是一个string处理函数等,shell代码将被截断。

顺便提一下,原来的问题:“任何理由做一个”xor eax,eax“? 不是什么MSVC ++编译器。

由于评论中关于如何在现实世界中相关的问题存在争议,请参阅本文和维基百科上的这一部分。

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

in指令正在做I / O端口的东西。 基本上从指定的dx中读取一个数据字并存储在al 。 目前还不清楚为什么在这里发生。 这里有一个参考 ,似乎详细解释它。

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

从OP>任何原因做“XOR EAX,EAX”返回0; 012B100B xor eax,eax ret < – OP不显示这个

XOR EAX,EAX仅仅是EAX寄存器中的0,它的执行速度比MOV EAX,$ 0快,并且不需要取0的即时数据加载到eax中

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

例如,xor通常用于encryption代码

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

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

  1001010110 0101001101 

如果你还是他们,结果是1100011011当两个位相互重叠时,结果位是0.否则结果位是1.你可以使用calc.exe来计算XOR。