第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地址内容。
#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
通过几个例子来了解分支语句的形成
语法:
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