考虑一个简单的循环:
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
答案 0 :(得分:4)
movl %eax, (%esp,%eax,4)
只是一个间接内存存储。
它将%eax
存储到内存位置:%esp + %eax * 4
。在这种情况下:
%esp
是数组a
。%eax
是索引i
。4
的大小为int
。对于第二个问题,Visual Studio输出的代码看起来就像是在没有优化的情况下完成的。存在大量过多的内存负载和存储。
例如:dword ptr [ebp-94h]
似乎是索引i
变量。但是没有优化,它从未被提升为注册。
启用优化,您将看到它将生成更加合理的代码。