作者danielguo (Daniel Guo)
看板Programming
标题Re: [问题] 面试遇到的程式问题,现在还想不出来(MTK)
时间Wed Jan 2 20:59:52 2008
我用 VS2005 试了一下, 程式码分别用:
void test()
{
for(i = 100; i >= 0; i--)
s = s + i;
}
void test2()
{
for(i = 100; --i; )
s += i;
}
// 这样出来会是 4950, 不过意思到了就好
未开最佳化:
test:
for(i = 100; i >= 0; i--)
004130BE mov dword ptr [_i (417184h)],64h
004130C8 jmp test+37h (4130D7h)
004130CA mov eax,dword ptr [_i (417184h)]
004130CF sub eax,1
004130D2 mov dword ptr [_i (417184h)],eax
004130D7 cmp dword ptr [_i (417184h)],0
004130DE jl test+52h (4130F2h)
s = s + i;
004130E0 mov eax,dword ptr [_s (417188h)]
004130E5 add eax,dword ptr [_i (417184h)]
004130EB mov dword ptr [_s (417188h)],eax
004130F0 jmp test+2Ah (4130CAh)
test2:
for(i = 100; --i; )
0041340E mov dword ptr [_i (417184h)],64h
00413418 mov eax,dword ptr [_i (417184h)]
0041341D sub eax,1
00413420 mov dword ptr [_i (417184h)],eax
00413425 je test2+49h (413439h)
s += i;
00413427 mov eax,dword ptr [_s (417188h)]
0041342C add eax,dword ptr [_i (417184h)]
00413432 mov dword ptr [_s (417188h)],eax
00413437 jmp test2+28h (413418h)
这边因为 for 少一个式子, 所以 test() 会简短一些
i-- 和 --i, 我记得在 i 是基本型别的时候没太大差别, 在 C++ 是物件的时候比较有差
开最佳化 (/O2):
test:
for(i = 100; i >= 0; i--)
00401020 mov ecx,dword ptr [s (403374h)]
00401026 mov eax,64h
0040102B jmp test+10h (401030h)
0040102D lea ecx,[ecx]
s = s + i;
00401030 add ecx,eax
00401032 sub eax,1
00401035 jns test+10h (401030h)
00401037 mov dword ptr [i (403370h)],eax
0040103C mov dword ptr [s (403374h)],ecx
test2:
for(i = 100; --i; )
00401050 mov ecx,dword ptr [s (403374h)]
00401056 mov eax,63h
0040105B jmp test2+10h (401060h)
0040105D lea ecx,[ecx]
s += i;
00401060 add ecx,eax
00401062 sub eax,1
00401065 jne test2+10h (401060h)
00401067 mov dword ptr [i (403370h)],eax
0040106C mov dword ptr [s (403374h)],ecx
时间一样, 所以对於简单内建型别的东西, 编译器就可以处理大部份的最佳化
当然用一些更激进的写法会更快, 不过可能就会牺牲易读性
工作时间应该用来改进一些 compiler 没办法做的地方比较适合~
新增 gcc 的部分, 第一次反组译 gcc 的执行档, 应该有混一些其他的东西进去
(gcc -O2 直接把函式 inline 了)
有开最佳化 (-O2):
test:
:00401050 55 push ebp
:00401051 8B0D10304000 mov ecx, dword[00403010]
:00401057 BA64000000 mov edx, 00000064
:0040105C 891514304000 mov dword[00403014], edx
:00401062 89E5 mov ebp, esp
:00401064 B864000000 mov eax, 00000064
:00401069 8DB42600000000 lea esi, dword[esi+00000000]
---------
:00401070 8D1401 lea edx, dword[ecx+eax]
:00401073 48 dec eax
:00401074 89D1 mov ecx, edx
:00401076 79F8 jns 00401070
:00401078 5D pop ebp
:00401079 B8FFFFFFFF mov eax, FFFFFFFF
:0040107E A314304000 mov dword[00403014], eax
:00401083 891510304000 mov dword[00403010], edx
:00401089 C3 ret
test2:
:00401050 55 push ebp
:00401051 8B0D10304000 mov ecx, dword[00403010]
:00401057 BA63000000 mov edx, 00000063
:0040105C 891514304000 mov dword[00403014], edx
:00401062 89E5 mov ebp, esp
:00401064 B863000000 mov eax, 00000063
:00401069 8DB42600000000 lea esi, dword[esi+00000000]
---------
:00401070 8D1401 lea edx, dword[ecx+eax]
:00401073 48 dec eax
:00401074 89D1 mov ecx, edx
:00401076 75F8 jne 00401070
:00401078 5D pop ebp
:00401079 31C0 xor eax, eax
:0040107B A314304000 mov dword[00403014], eax
:00401080 891510304000 mov dword[00403010], edx
:00401086 C3 ret
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.50.147
1F:推 abcdefghi:IC Design House的考题,应该用ARM/8051 140.113.23.107 01/02 21:08
2F:→ abcdefghi:的开发工具比较好. 像ADS,GCC,GHS,Keil 140.113.23.107 01/02 21:09
3F:→ danielguo:刚试了一下 gcc, 不开最佳化有小小 220.135.50.147 01/02 21:40
4F:→ danielguo:的差异 (行数差不多, 指令不同) 220.135.50.147 01/02 21:41
※ 编辑: danielguo 来自: 220.135.50.147 (01/02 21:53)