1

考虑一个简单的循环:

for(int i=0;i<32;i++) 
    a[i] = i;

LLVM 反汇编程序显示以下程序集:

.LBB0_1:                                # =>This Inner Loop Header: Depth=1
movl    %eax, (%esp,%eax,4)
addl    $1, %eax
adcl    $0, %ecx
cmpl    $32, %eax
jne .LBB0_1
# BB#2:
xorl    %eax, %eax
addl    $140, %esp
ret

问题1:谁能解释一下movl %eax, (%esp,%eax,4)指令?

此外,Visual Studio 反汇编程序输出以下程序集:

    ;for(int i=0;i<32;i++)
00F290B5  mov         dword ptr [ebp-94h],0  
00F290BF  jmp         main+60h (0F290D0h)  
00F290C1  mov         eax,dword ptr [ebp-94h]  
00F290C7  add         eax,1  
00F290CA  mov         dword ptr [ebp-94h],eax  
00F290D0  cmp         dword ptr [ebp-94h],20h  
00F290D7  jge         main+7Eh (0F290EEh)  
        ;a[i] = i;
00F290D9  mov         eax,dword ptr [ebp-94h]  
00F290DF  mov         ecx,dword ptr [ebp-94h]  
00F290E5  mov         dword ptr a[eax*4],ecx  
00F290EC  jmp         main+51h (0F290C1h)  
    ;return 0;
00F290EE  xor         eax,eax   

显然 LLVM 的输出更加优化。

问题 2: Visual Studio 中有没有像 LLVM 那样优化代码的选项?



更新:

将解决方案配置设置为发布 & 优化为完全优化 (/Ox) 后的结果:

;   int a[32] = {0};
;   for(int i=0;i<32;i++)
 0039128B  xor         eax,eax  
 0039128D  lea         ecx,[a]  
 00391293  movd        xmm0,eax  
 00391297  pshufd      xmm0,xmm0,0  
 0039129C  paddd       xmm0,xmm1  
 003912A0  add         eax,4  
;   {
;       a[i] = i;
 003912A3  movdqu      xmmword ptr [ecx],xmm0  
 003912A7  lea         ecx,[ecx+10h]  
 003912AA  cmp         eax,20h  
 003912AD  jl          main+23h (0391293h)  
;   }
;   return 0;
; };
 003912AF  mov         ecx,dword ptr [ebp-4]  
 003912B2  xor         ecx,ebp  
 003912B4  xor         eax,eax  
 003912B6  call        __security_check_cookie (03916FDh)  
 003912BB  mov         esp,ebp  
 003912BD  pop         ebp  
 003912BE  ret  
4

1 回答 1

4

movl %eax, (%esp,%eax,4)只是一个间接的内存存储。

它存储%eax到内存位置:%esp + %eax * 4. 在这种情况下:

  • %esp是数组a
  • %eax是索引i
  • 4是 的大小int

对于第二个问题,Visual Studio 输出的代码看起来像是在没有优化的情况下完成的。有很多过多的内存负载和存储。

例如:dword ptr [ebp-94h]似乎是索引i变量。但是如果没有优化,它就永远不会被提升为寄存器。

启用优化,你会看到它会产生更健全的代码。

于 2012-07-26T00:09:16.630 回答