movl多数据指令和装配优化比较

时间:2012-07-25 23:47:05

标签: c++ visual-studio assembly llvm disassembly

考虑一个简单的循环:

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之类的代码?



更新

将解决方案配置设置为发布后的结果&amp;优化到完全优化(/ 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  

1 个答案:

答案 0 :(得分:4)

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

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

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

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

例如:dword ptr [ebp-94h]似乎是索引i变量。但是没有优化,它从未被提升为注册。

启用优化,您将看到它将生成更加合理的代码。