==
if(i==5){ jne ==
下面汇编还原:
//把jne 和 == 联系起来,埋下心锚,是不是很好理解}
int i=6;
013713BE mov dword ptr [i],6
if(i==5){
013713C5 cmp dword ptr [i],5
013713C9 jne wmain+42h (013713F7h) if(i == 5)//就执行下面代码
printf("1ni");
013713CB mov esi,esp
013713F7 ret
---------------------
if(i > 5){ jle >
下面汇编还原:
//把jle 和 > 联系起来,埋下心锚,是不是很好理解}
int i=6;
010813BE mov dword ptr [i],6
if(i>5){
010813C5 cmp dword ptr [i],5
010813C9 jle wmain+42h (010813E4h)
printf("1ni");
010813CB mov esi,esp
010813E4 pop edi
---------------------
if(i < 5){ jge <
下面汇编还原:
//把jge和 < 联系起来,埋下心锚,是不是很好理解}
int i=6;
011A13BE mov dword ptr [i],6
if(i<5){
011A13C5 cmp dword ptr [i],5
011A13C9 jge wmain+42h (011A13E2h)
printf("1ni");
011A13CB mov esi,esp
011A13E2 xor eax,eax
---------------------
if(i != 5){ je !=
下面汇编还原:
//把je和 != 联系起来,埋下心锚,是不是很好理解}
int i=6;
010D13BE mov dword ptr [i],6
if(i!=5){
010D13C5 cmp dword ptr [i],5
010D13C9 je wmain+42h (10D13E2h)
printf("1ni");
010D13CB mov esi,esp
010D13CD push offset string "1ni" (010D13E2h)
010D13E2 xor eax,eax
---------------------
if(i >= 5){ jl >=
下面汇编还原:
//把jl和 >= 联系起来,埋下心锚,是不是很好理解}
int i=6;
013F13BE mov dword ptr [i],6
if(i>=5){
013F13C5 cmp dword ptr [i],5
013F13C9 jl wmain+42h (13F13E2h)
printf("1ni");
013F13CB mov esi,esp
013F13CD push offset string "1ni" (013F13E2h)
013F13E2 xor eax,eax
}
---------------------
if(i <= 5){ jg <=
下面汇编还原:
//把jg和 <= 联系起来,埋下心锚,是不是很好理解}
int i=6;
00C113BE mov dword ptr [i],6
if(i<=5){
00C113C5 cmp dword ptr [i],5
00C113C9 jg wmain+42h (00C113E2h)
printf("1ni");
00C113CB mov esi,esp
00C113E2 xor eax,eax
}
---------------------
int _tmain ( int argc , _TCHAR * argv[])
{
int i =6;
if (i <=5){
printf ("1ni" );
} else {
printf ("1ni" );
}
return 0;
}
int i=6;
001E1A4E mov dword ptr [i],6
if(i<=5){
001E1A55 cmp dword ptr [i],5
001E1A59 jg wmain+44h (1E1A74h) if(i<=5).执行下面的代码,否则就跳到地址处执行
printf("1ni");
001E1A5B mov esi,esp
001E1A5D push offset string "1ni" (1E573Ch)
001E1A62 call dword ptr [__imp__printf (1E82BCh)]
001E1A68 add esp,4
001E1A6B cmp esi,esp
001E1A6D call @ILT+320(__RTC_CheckEsp) (1E1145h)
}else{
001E1A72 jmp wmain+5Bh (1E1A8Bh) //这里可以理解为if的结尾
printf("1ni");
001E1A74 mov esi,esp //这里可以理解为else的开始处
001E1A76 push offset string "1ni" (1E573Ch)
001E1A7B call dword ptr [__imp__printf (1E82BCh)]
001E1A81 add esp,4
001E1A84 cmp esi,esp
001E1A86 call @ILT+320(__RTC_CheckEsp) (1E1145h)
}
return 0;
001E1A8B xor eax,eax
}
---------------------
int _tmain ( int argc , _TCHAR * argv[])
{
int i =6;
if (i <=5){
printf ("1ni" );
} else if ( i>=5){
printf ("1ni" );
} else {
printf ("1ni" );
}
return 0;
}
int i=6;
00AB1A4E mov dword ptr [i],6
if(i<=5){
00AB1A55 cmp dword ptr [i],5
00AB1A59 jg wmain+44h (0AB1A74h) //遇到这个可以直接理解为if,或者else if
printf("1ni");
00AB1A5B mov esi,esp
00AB1A5D push offset string "1ni" (0AB573Ch)
00AB1A62 call dword ptr [__imp__printf (0AB82BCh)]
00AB1A68 add esp,4
00AB1A6B cmp esi,esp
00AB1A6D call @ILT+320(__RTC_CheckEsp) (0AB1145h)
00AB1A72 jmp wmain+7Ah (0AB1AAAh) //说明是跳到else最后面
}else if(i>=5){
00AB1A74 cmp dword ptr [i],5
00AB1A78 jl wmain+63h (0AB1A93h) //如果是从其他地方跳到这里来的,说明这是else if
printf("1ni");
00AB1A7A mov esi,esp
00AB1A7C push offset string "1ni" (0AB573Ch)
00AB1A81 call dword ptr [__imp__printf (0AB82BCh)]
00AB1A87 add esp,4
00AB1A8A cmp esi,esp
00AB1A8C call @ILT+320(__RTC_CheckEsp) (0AB1145h)
}else{
00AB1A91 jmp wmain+7Ah (0AB1AAAh) ////说明是跳到else最后面
printf("1ni");
00AB1A93 mov esi,esp // 这个是最后的else,这是else的开始位置
00AB1A95 push offset string "1ni" (0AB573Ch)
00AB1A9A call dword ptr [__imp__printf (0AB82BCh)]
00AB1AA0 add esp,4
00AB1AA3 cmp esi,esp
00AB1AA5 call @ILT+320(__RTC_CheckEsp) (0AB1145h)
}
return 0;
00AB1AAA xor eax,eax
}
---------------------
int _tmain ( int argc , _TCHAR * argv[])
{
int i =6;
switch (i )
{
case 1:
printf ("1" );
break ;
case 2:
printf ("2" );
break ;
default :
printf ("default" );
}
return 0;
}
switch代码还原:
int i=6;
012A2FEE mov dword ptr [i],6
switch (i)
012A2FF5 mov eax,dword ptr [i]
012A2FF8 mov dword ptr [ebp-0D0h],eax
012A2FFE cmp dword ptr [ebp-0D0h],1 //如果遇到cmp,je,cmp,je,jmp意思就是2个case,一个default
012A3005 je wmain+42h (12A3012h)
012A3007 cmp dword ptr [ebp-0D0h],2
012A300E je wmain+5Bh (12A302Bh) // je 表示!=.意思就是如果 i!=2.就执行下面的jmp,否则跳入case
012A3010 jmp wmain+74h (12A3044h)
{
case 1:
printf("1");
012A3012 mov esi,esp
012A3014 push offset string "1" (12A57A8h)
012A3019 call dword ptr [__imp__printf (12A82BCh)]
012A301F add esp,4
012A3022 cmp esi,esp
012A3024 call @ILT+320(__RTC_CheckEsp) (12A1145h)
break;
012A3029 jmp wmain+8Bh (12A305Bh)
case 2:
printf("2");
012A302B mov esi,esp
012A302D push offset string "2" (12A573Ch)
012A3032 call dword ptr [__imp__printf (12A82BCh)]
012A3038 add esp,4
012A303B cmp esi,esp
012A303D call @ILT+320(__RTC_CheckEsp) (12A1145h)
break;
012A3042 jmp wmain+8Bh (12A305Bh) //break 相当于跳出这个循环
default:
printf("default");
012A3044 mov esi,esp
012A3046 push offset string "default" (12A57A0h)
012A304B call dword ptr [__imp__printf (12A82BCh)]
012A3051 add esp,4
012A3054 cmp esi,esp
012A3056 call @ILT+320(__RTC_CheckEsp) (12A1145h)
}
return 0;
012A305B xor eax,eax
}
//补充,如果是:
case 1:
case 3:
do_while循环还原:
int i=6;
00352FEE mov dword ptr [i],6
do{
printf("11");
00352FF5 mov esi,esp
00352FF7 push offset string "default" (3557A0h)
00352FFC call dword ptr [__imp__printf (3582BCh)]
00353002 add esp,4
00353005 cmp esi,esp
00353007 call @ILT+320(__RTC_CheckEsp) (351145h)
i++;
0035300C mov eax,dword ptr [i]
0035300F add eax,1
00353012 mov dword ptr [i],eax
}while(i>10);
00353015 cmp dword ptr [i],0Ah
00353019 jg wmain+25h (352FF5h)//如果是往上面跳的就可以理解为是一个do while循环
return 0;
0035301B xor eax,eax
}
while 循环还原:
int i=6;
002D2FEE mov dword ptr [i],6
while(i>3){
002D2FF5 cmp dword ptr [i],3
002D2FF9 jle wmain+4Dh (2D301Dh) // 这里可以理解成一个if or else if or while ,这个需要看后面的jmp指令了
i--;
002D2FFB mov eax,dword ptr [i]
002D2FFE sub eax,1
002D3001 mov dword ptr [i],eax
printf("sd");
002D3004 mov esi,esp
002D3006 push offset string "default" (2D57A0h)
002D300B call dword ptr [__imp__printf (2D82BCh)]
002D3011 add esp,4
002D3014 cmp esi,esp
002D3016 call @ILT+320(__RTC_CheckEsp) (2D1145h)
}
002D301B jmp wmain+25h (2D2FF5h) //如果这里的jmp指令是往前面跳转的话,那么他就是一个while循环
return 0;
002D301D xor eax,eax
}
for循环还原:
int i=6;
000C2FEE mov dword ptr [i],6
for(i=0;i<123;i++){
000C2FF5 mov dword ptr [i],0
000C2FFC jmp wmain+37h (0C3007h) //跳到这个地方
000C2FFE mov eax,dword ptr [i]
000C3001 add eax,1
000C3004 mov dword ptr [i],eax
000C3007 cmp dword ptr [i],7Bh //这个是第一步开始的地方
000C300B jge wmain+56h (0C3026h) // jge = <, i < 7BH,就执行下面的代码,否则就跳出循环
printf("a");
000C300D mov esi,esp
000C300F push offset string "11" (0C57A0h)
000C3014 call dword ptr [__imp__printf (0C82BCh)]
000C301A add esp,4
000C301D cmp esi,esp
000C301F call @ILT+320(__RTC_CheckEsp) (0C1145h)
}
000C3024 jmp wmain+2Eh (0C2FFEh)
return 0;
000C3026 xor eax,eax
}
那么他就会多加一个cmp 和 je i!=6 继续判断下面的