近来编译器都是老奇葩了
最近编译器都是老奇葩了
已经不是第一次了,编译器老是篡改我的意图,之前找PhkFirstGlobalValid的函数地址,特征匹配的时候,往回匹配代码
while( *pbuf != 0x90 )
{
pbuf--;
}
结果死循环了,不调不知道,一调,擦,,*pbuf被编译成固定值存在寄存器中,每次pbuf--后,寄存器还是原来的值去跟0x90比较,
泪流满面啊。
可能是我代码风格写的特别乱吧,编译器老是跟我作对,我都无语了。
编译环境:win7 sp1 x64
编译器: VC++6.0、VS 2008
编译代码
VC6编译结果(问题部分):

VS2008编译结果:
已经不是第一次了,编译器老是篡改我的意图,之前找PhkFirstGlobalValid的函数地址,特征匹配的时候,往回匹配代码
while( *pbuf != 0x90 )
{
pbuf--;
}
结果死循环了,不调不知道,一调,擦,,*pbuf被编译成固定值存在寄存器中,每次pbuf--后,寄存器还是原来的值去跟0x90比较,
可能是我代码风格写的特别乱吧,编译器老是跟我作对,我都无语了。
编译环境:win7 sp1 x64
编译器: VC++6.0、VS 2008
编译代码
#include <stdio.h>
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(int argc, char* argv[])
{
int total = 0;
int xinqi = 2;
for (int i=0; i<12; i++)
{
for (int j=0; j<month[i]; j++, xinqi++)
{
if ( xinqi == 6 || xinqi == 7 )
{
total++;
}
if ( xinqi == 8 )
{
xinqi == 1;
}
}
}
printf("%d\n", total);
return 0;
}
VC6编译结果(问题部分):
19: {
20: total++;
00401084 mov edx,dword ptr [ebp-4]
00401087 add edx,1
0040108A mov dword ptr [ebp-4],edx
21: }
22: if ( xinqi == 8 )
23: {
24: xinqi == 1;
25: }
26: }
0040108D jmp main+47h (00401057)
27: }
0040108F jmp main+2Fh (0040103f)
VS2008编译结果:
{
if ( xinqi == 6 || xinqi == 7 )
0042D68E cmp dword ptr [xinqi],6