首页 > 代码库 > 反汇编--C语言(判断与分支)

反汇编--C语言(判断与分支)

if  else条件判断 C语言实现:
void Conditional(int c){
 if (c>0 && c<10)
 {
  printf("c大于0,小于10");
 }
 else if(c>10 && c<100)
 {
  printf("c大于10,小于100");
 }
 else{
  printf("其它");
 }
}
void main(){
 int num=5;
 Conditional(num);
 return 0;
}



反汇编
1: void Conditional(int c){
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
2: if (c>0 && c<10)
//先比较变量C和0
00401038 cmp dword ptr [ebp+8],0
//小于或者等于则跳转到00401053处执行else if 部分
0040103C jle Conditional+33h (00401053)
//然后比较变量C和10(0AH)
0040103E cmp dword ptr [ebp+8],0Ah
//大于 或者等于则跳转到00401053处执行esle if部分
00401042 jge Conditional+33h (00401053)
3: {
4: printf("c大于0,小于10");
//将字符串压入栈中   这里的汉字采用了GBK编码方式 x是十六进制数  b4\f3 =大 d3\da=于 ...
00401044 push offset string "c\xb4\xf3\xd3\xda0,\xd0\xa1\xd3\xda10" (00422038)
//调用printf子程序,打印字符串
00401049 call printf (00401100)
//调用完printf子程序后恢复esp栈顶指向。
0040104E add esp,4
5: }
6: else if(c>10 && c<100)
//else if 在开始处有一个无条件跳转指令,跳转到0040107B判断结束处,阻止前面的分支执行完后跳到这个分支执行。
00401051 jmp Conditional+5Bh (0040107b)
//这里同上面的if比较相同
00401053 cmp dword ptr [ebp+8],0Ah
00401057 jle Conditional+4Eh (0040106e)
00401059 cmp dword ptr [ebp+8],64h
0040105D jge Conditional+4Eh (0040106e)
7: {
8: printf("c大于10,小于100");
0040105F push offset string "c\xb4\xf3\xd3\xda10,\xd0\xa1\xd3\xda100" (00422024)
00401064 call printf (00401100)
00401069 add esp,4
9: }
10: else{
//最后的else 同样是有一个无条件跳转指令 跳转到判断结束处,阻止前面的分支执行完后跳到这个分支执行。
0040106C jmp Conditional+5Bh (0040107b)
11: printf("其它");
0040106E push offset string "\xc6\xe4\xcb\xfc" (0042201c)
00401073 call printf (00401100)
00401078 add esp,4
12: }
13: }
//恢复各个寄存器的值,检查esp的值后程序返回
0040107B pop edi
0040107C pop esi
0040107D pop ebx
0040107E add esp,40h
00401081 cmp ebp,esp
00401083 call __chkesp (00401180)
00401088 mov esp,ebp
0040108A pop ebp
0040108B ret



switch条件判断C语言实现:
void Conditional(int c){
 switch(c)
 {
 case 0: printf("c>0");
 case 1: {
   printf("c>10 && c<100");
   break;
   }
 default: printf("c>10 && c<100");
 
 }
}
void main(){
 int num=5;
 Conditional(num);
 return 0;
}


反汇编
1: void Conditional(int c){
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]

2: switch(c)
3: {
//这里将变量c的值送入eax中
00401038 mov eax,dword ptr [ebp+8]
//将eax的值复制到  [ebp-4]处 
0040103B mov dword ptr [ebp-4],eax
//把这个值和 0 进行比较
0040103E cmp dword ptr [ebp-4],0
//相等则跳转到case 0处执行
00401042 je Conditional+2Ch (0040104c)
//继续和1进行比较
00401044 cmp dword ptr [ebp-4],1
//相等则跳转到case 1处执行
00401048 je Conditional+39h (00401059)
//这里有一个无条件跳转   如果以上条件都不满足直接跳转到00401068  default处
0040104A jmp Conditional+48h (00401068)
4: case 0: printf("c>0");
0040104C push offset string "c>0" (00422024)
00401051 call printf (00401100)
00401056 add esp,4
5:
6: case 1: {
7: printf("c>10 && c<100");
00401059 push offset string "c>10 && c<100" (00422fcc)
0040105E call printf (00401100)
00401063 add esp,4
//这里break  用的 jmp 无条件指令  直接跳出
8: break;
00401066 jmp Conditional+55h (00401075)
9: }
10:
11: default: printf("c>10 && c<100");
00401068 push offset string "c>10 && c<100" (00422fcc)
0040106D call printf (00401100)
00401072 add esp,4
//后面基本相同省略