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
是什么意思?
答案 0 :(得分:134)
是的,效率更高。
操作码短于mov eax, 0
,只有2个字节,并且处理器识别特殊情况并将其视为mov eax, 0
而没有eax
的错误读取依赖性,因此执行时间是一样的。
答案 1 :(得分:25)
当编译为在shell代码上使用以避免利用缓冲区溢出等时,也要避免使用0。为什么要避免使用0?嗯,0表示c / c ++中字符串的结尾,如果利用的平均值是字符串处理函数等,则shell代码将被截断。
顺便说一下,我提到原来的问题:“有什么理由去做”xor eax,eax“?而不是MSVC ++编译器的功能。
由于评论中关于这在现实世界中的相关性存在争议,请参阅this article和this 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, reg
或XORPS 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。