の単純なループを考えてみましょう:
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