#include <stdio.h>
void ttt(size_t bsize)
{
size_t _size = bsize > 1 ? bsize : 9;
printf("real set id : %d \n",_size);
}
inline void set(size_t id ,bool val)
{
size_t ns = id * 2 ;
ttt(ns);
}
int main()
{
for (int i = 2 ;i < 5 ;i++){
printf("set i: %d \n",i);
set(i,true);
getchar();
}
getchar();
return 0;
}
VS2008 ,Debug 版本正常 编译Release 异常 ,下面是Release版的汇编代码,有明显错误
/*错误的优化代码*/
_main:
00401000: 53 push ebx
00401001: 8B 1D A0 20 40 00 mov ebx,dword ptr [__imp__getchar]
00401007: 56 push esi
00401008: 57 push edi
00401009: 8B 3D A4 20 40 00 mov edi,dword ptr [__imp__printf]
0040100F: BE 02 00 00 00 mov esi,2
00401014: 56 push esi
00401015: 68 18 21 40 00 push offset ??_C@_0M@DAPCNNFP@set?5i?3?5?$CFd?5?6?$AA@
0040101A: FF D7 call edi
0040101C: 83 C4 08 add esp,8
0040101F: 8D 04 36 lea eax,[esi+esi]
00401022: 83 FE FF cmp esi,0FFFFFFFFh /* 比较的是 1 此处为何成整数最大值 ,而且 esi 也还是没有乘以 2 之前的变量i的值 */
00401025: 77 05 ja 0040102C
00401027: B8 09 00 00 00 mov eax,9
0040102C: 50 push eax
0040102D: 68 04 21 40 00 push offset ??_C@_0BD@ENCIACNH@real?5set?5id?5?3?5?$CFd?5?6?$AA@
00401032: FF D7 call edi
00401034: 83 C4 08 add esp,8
00401037: FF D3 call ebx
00401039: 46 inc esi
0040103A: 83 FE 05 cmp esi,5
0040103D: 7C D5 jl 00401014
0040103F: FF D3 call ebx
00401041: 5F pop edi
00401042: 5E pop esi
00401043: 33 C0 xor eax,eax
00401045: 5B pop ebx
00401046: C3 ret
将源码稍加修改 --- 删除main函数中printf函数,就对了,
//
/*源码*/
#include <stdio.h>
void ttt(size_t bsize)
{
size_t _size = bsize > 1 ? bsize : 9;
printf("real set id : %d \n",_size);
}
inline void set(size_t id ,bool val)
{
size_t ns = id * 2 ;
ttt(ns);
}
int main()
{
for (int i = 2 ;i < 5 ;i++){
//printf("set i: %d \n",i);
set(i,true);
getchar();
}
getchar();
return 0;
}
/*正确的优化代码*/
_main:
00401000: 53 push ebx
00401001: 8B 1D A4 20 40 00 mov ebx,dword ptr [__imp__printf]
00401007: 56 push esi
00401008: 57 push edi
00401009: 8B 3D A0 20 40 00 mov edi,dword ptr [__imp__getchar]
0040100F: BE 04 00 00 00 mov esi,4
00401014: 8B C6 mov eax,esi
00401016: 83 FE 01 cmp esi,1 /*此处正确*/
00401019: 77 05 ja 00401020
0040101B: B8 09 00 00 00 mov eax,9
00401020: 50 push eax
00401021: 68 04 21 40 00 push offset ??_C@_0BD@ENCIACNH@real?5set?5id?5?3?5?$CFd?5?6?$AA@
00401026: FF D3 call ebx
00401028: 83 C4 08 add esp,8
0040102B: FF D7 call edi
0040102D: 83 C6 02 add esi,2
00401030: 83 FE 0A cmp esi,0Ah
00401033: 7C DF jl 00401014
00401035: FF D7 call edi
00401037: 5F pop edi
00401038: 5E pop esi
00401039: 33 C0 xor eax,eax
0040103B: 5B pop ebx
0040103C: C3 ret
百思不得其解,请大侠指教