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 のようにコードを最適化するオプションはありますか?



アップデート:

Solution Configurations を Release に設定し、Optimization を Full Optimization(/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

2 番目の質問については、Visual Studio によって出力されたコードは、最適化なしで行われたように見えます。過剰なメモリのロードとストアがたくさんあります。

例:dword ptr [ebp-94h]はインデックスi変数のようです。しかし、最適化がなければ、レジスターに昇格することはありませんでした。

最適化を有効にすると、より健全なコードが生成されることがわかります。

于 2012-07-26T00:09:16.630 に答える