day36.分支语句

第36节:分支语句

通过几个例子来了解分支语句的形成

语法:
if(表达式)
    语句;
或者
if(表达式)
{
    语句1;
    语句2;
}

例子1:
#include<stdio.h>
#include<windows.h>
void main(){
int x = 10;
int y = 20;
if(x==y)
{
printf("----\n");
printf("++++\n");
}
return;
}

反汇编代码:
4:    void main(){
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,48h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-48h]
0040101C   mov         ecx,12h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
5:        int x = 10;
00401028   mov         dword ptr [ebp-4],0Ah
6:        int y = 20;
0040102F   mov         dword ptr [ebp-8],14h
7:        if(x==y)
00401036   mov         eax,dword ptr [ebp-4]
00401039   cmp         eax,dword ptr [ebp-8]
0040103C   jne         main+48h (00401058)
8:        {
9:            printf("----\n");
0040103E   push        offset string "----\n" (00422024)
00401043   call        printf (00401080)
00401048   add         esp,4
10:           printf("++++\n");
0040104B   push        offset string "++++\n" (0042201c)
00401050   call        printf (00401080)
00401055   add         esp,4
11:       }
12:       return;
13:   }
00401058   pop         edi
注意:看0040103C地址编号,如果x==y则通过jne进行跳转到00401058地址执行。

例子2:
if...else.....
#include<stdio.h>
#include<windows.h>
void main(){
int x = 10;
int y = 20;
if(x==y)
{
printf("----\n");

}
else{
printf("++++\n");
}
return;
}

反汇编代码:
5:        int x = 10;
00401028   mov         dword ptr [ebp-4],0Ah
6:        int y = 20;
0040102F   mov         dword ptr [ebp-8],14h
7:        if(x==y)
00401036   mov         eax,dword ptr [ebp-4]
00401039   cmp         eax,dword ptr [ebp-8]
0040103C   jne         main+3Dh (0040104d)
8:        {
9:            printf("----\n");
0040103E   push        offset string "----\n" (00422024)
00401043   call        printf (00401080)
00401048   add         esp,4
10:
11:       }
12:       else{
0040104B   jmp         main+4Ah (0040105a)
13:           printf("++++\n");
0040104D   push        offset string "++++\n" (0042201c)
00401052   call        printf (00401080)
00401057   add         esp,4
14:       }
15:       return;
16:   }
0040105A   pop         edi
[ebp-4] 和[ebp-8]比较,如果不相等跳转到0040104D地址执行,如果相等执行0040103E地址内容。


例子3:

if嵌套语句
#include<stdio.h>
#include<windows.h>
int big(int x,int y,int z)
{
int r = 0;
if(x>y)
{
if(x>z)
{
r = x;
}
else{
r = z;
}
}else{
if(y>z)
{
r = y;
}
else{
r = z;
}
}
return;
}

void main(){
 int k = big(1,2,3);
return;
}


反汇编代码:
6:        int r = 0;
00401028   mov         dword ptr [ebp-4],0
7:        if(x>y)
0040102F   mov         eax,dword ptr [ebp+8]
00401032   cmp         eax,dword ptr [ebp+0Ch]
00401035   jle         big+3Fh (0040104f)
8:        {
9:            if(x>z)
00401037   mov         ecx,dword ptr [ebp+8]
0040103A   cmp         ecx,dword ptr [ebp+10h]
0040103D   jle         big+37h (00401047)
10:           {
11:               r = x;
0040103F   mov         edx,dword ptr [ebp+8]
00401042   mov         dword ptr [ebp-4],edx
12:           }
13:           else{
00401045   jmp         big+3Dh (0040104d)
14:               r = z;
00401047   mov         eax,dword ptr [ebp+10h]
0040104A   mov         dword ptr [ebp-4],eax
15:           }
16:       }else{
0040104D   jmp         big+55h (00401065)
17:           if(y>z)
0040104F   mov         ecx,dword ptr [ebp+0Ch]
00401052   cmp         ecx,dword ptr [ebp+10h]
00401055   jle         big+4Fh (0040105f)
18:           {
19:               r = y;
00401057   mov         edx,dword ptr [ebp+0Ch]
0040105A   mov         dword ptr [ebp-4],edx
20:           }
21:           else{
0040105D   jmp         big+55h (00401065)
22:               r = z;
0040105F   mov         eax,dword ptr [ebp+10h]
00401062   mov         dword ptr [ebp-4],eax
23:           }
24:       }
25:       return;
26:   }
00401065   pop         edi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随行之旅

python国产化自动化

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值