if…else if…else if…else多分支语句的反汇编判断
IF_begin:
影响标志位的指令;
jxx [else if 的地址];
IF_end
jmp end;
else if_begin:
影响标志位的指令;
jxx [else is 的地址]
else begin:
......
else end;
end;
案例分析(忽略了开堆栈和恢复堆栈的部分)
004010C8 mov dword ptr [ebp-4],0
004010CF mov dword ptr [ebp-8],1
004010D6 mov dword ptr [ebp-0Ch],2
004010DD mov eax,dword ptr [ebp+8]
004010E0 cmp eax,dword ptr [ebp+0Ch]
004010E3 jle 004010f0
004010E5 mov ecx,dword ptr [ebp-8]
004010E8 add ecx,1
004010EB mov dword ptr [ebp-4],ecx
004010EE jmp 00401123
004010f0 mov edx,dword ptr [ebp+8]
004010F3 cmp edx,dword ptr [ebp+10h]
004010F6 jle 00401103
004010F8 mov eax,dword ptr [ebp-0Ch]
004010FB add eax,1
004010FE mov dword ptr [ebp-4],eax
00401101 jmp 00401123
00401103 mov ecx,dword ptr [ebp+0Ch]
00401106 cmp ecx,dword ptr [ebp+10h]
00401109 jle 00401116
0040110B mov edx,dword ptr [ebp-8]
0040110E add edx,dword ptr [ebp-0Ch]
00401111 mov dword ptr [ebp-4],edx
00401114 jmp 00401123
00401116 mov eax,dword ptr [ebp-0Ch]
00401119 mov ecx,dword ptr [ebp-8]
0040111C lea edx,[ecx+eax+1]
00401120 mov dword ptr [ebp-4],edx
00401123 mov eax,dword ptr [ebp-4]
int func(int a,int b,int c){
int x=0,y=1,z=2;
if(a>b){
x = y+1;
}
else if(a>c){
x = z+1;
}
else if(b>c){
x = y+z+1;
}
return x;
}
int main(){
int a,b,c;
func(a,b,c);
}