操作数为 0 的 SHL

逆向工程 部件 x86
2021-06-29 16:40:16

在下面由 Visual Studio 2017 生成的 x86 汇编代码片段中,我看到了指令

shl         eax,0

这个指令的目的是什么,因为它应该作为我理解的 NOP。

int main(int argc, char ** argv){
011C1340  push        ebp  
011C1341  mov         ebp,esp  
011C1343  push        ecx  
    int a;
    a = atoi(argv[1]);
011C1344  mov         eax,4  
011C1349  shl         eax,0  
011C134C  mov         ecx,dword ptr [argv]  
011C134F  mov         edx,dword ptr [ecx+eax]
1个回答

它似乎是数组访问计算的未优化版本。未启用优化时,您可能会看到各种通过优化消除的冗余/无用计算。编译器可能做了这样的事情:

delta = elemsize*index
elemsize = 4, index=1
delta = 4*1 -> 4*(1 shl 0) -> 4 shl 0

然后在汇编中由 codegen 忠实地复制。