与自己对寄存器进行异或的目的是什么?

时间:2009-09-08 21:54:39

标签: assembly x86

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是什么意思?

7 个答案:

答案 0 :(得分:134)

是的,效率更高。

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

答案 1 :(得分:25)

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

顺便说一下,我提到原来的问题:“有什么理由去做”xor eax,eax“?而不是MSVC ++编译器的功能。

由于评论中关于这在现实世界中的相关性存在争议,请参阅this articlethis section on Wikipedia.

答案 2 :(得分:14)

xor eax, eax是将eax设置为零的更快捷方式。这种情况正在发生,因为你将返回零。

in指令正在处理I / O端口。基本上从指定dx的端口读取数据字并将其存储在al中。目前尚不清楚为什么会发生这种情况。这是reference似乎可以详细解释它。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

使用XOR reg, regXORPS reg, reg的另一个原因是打破依赖链,这允许CPU更有效地优化程序集命令的并行执行(即使它增加了更多的指令吞吐量)

答案 5 :(得分:-1)

来自OP>任何理由做“xor eax,eax” 返回0; 012B100B xor eax,eax           ret< - OP没有显示这个

XOR EAX,EAX只是0的EAX寄存器,它的执行速度比a快 MOV EAX,$ 0并且不需要获取0的立即数据以加载到eax

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

答案 6 :(得分:-6)

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。