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
Run Code Online (Sandbox Code Playgroud)
另外,这意味着什么in al, dx?
Gun*_*iez 140
是的,效率更高.
操作码短于mov eax, 02个字节,并且处理器识别特殊情况并将其视为mov eax, 0没有错误读取依赖性eax,因此执行时间相同.
kri*_*ash 27
也是为了避免在编译时使用shell代码以利用缓冲区溢出等来使用0.为什么要避免使用0?嗯,0表示c/c ++中字符串的结尾,如果利用的平均值是字符串处理函数等,则shell代码将被截断.
顺便提一下,我提到了原来的问题:"有什么理由去做"xor eax,eax"?而不是MSVC++编译器的功能.
由于评论中关于这在现实世界中的相关性存在争议,请参阅本文和Wikipedia上的这一部分.
| 归档时间: |
|
| 查看次数: |
61794 次 |
| 最近记录: |