C语言之 判断语句基础与if语句反汇编
0x01.判断语句介绍以及用法
判断语句有哪些?
1、If
用法1:
if (条件)
{
//代码块
}
当条件成立,也就是为True时,执行{}中的代码
用法2:
if(条件)
{
//代码块
}
else
{
//代码块
}
如上,当条件不成立的时候执行else语句里面的代码
用法3:
if(条件)
{
//代码块
}
else if
{
//代码块
}
else
{
//代码块
}
例如
2、Switch
switch (表达式)
{
case 常量表达式1:
语句;
break;
case 常量表达式2:
语句;
break;
case 常量表达式3:
语句;
break;
case 常量表达式3:
语句;
break;
default:
语句;
break;
}
switch要求:
1、case后面必须是常量表达式
2、case后常量表达式的值不能一样
3、switch后面表达式必须为整数
3、?:运算符
int main()
{
int a = 10;
int b = 5;
int c = a > b ? a : b;
printf("%d", c);
return 0;
}
到此,条件判断语句就差不多了
0x02.JCC指令与IF语句反汇编
1、案例一
mov eax, dword ptr[ebp + 8] 分析:cmp指令 影响标志位
cmp eax, dword ptr[ebp + 0Ch] jle :小于或者等于就跳转到00401059
jle 00401059
2、案例二
mov eax, dword ptr[ebp + 8] 分析:cmp指令 影响标志位
cmp eax, dword ptr[ebp + 0Ch] jl :小于则跳转
jl 00401059
3、案例三
mov eax, dword ptr[ebp + 8] jge :大于或者等于则跳转
cmp eax, dword ptr[ebp + 0Ch]
jge 00401059
4、案例四
mov eax, dword ptr[ebp + 8] jg :大于则跳转
cmp eax, dword ptr[ebp + 0Ch]
jg 00401059
整体分析:
函数调用处代码:
push 5 分析:
push 4 两个参数
call 0040100f
add esp, 8
接下来就可以做个小练习了:
调用处代码:
push 5
push 4
call 0040100f
add esp, 8
函数内部:
函数内部功能分析:
00401030 push ebp
00401031 mov ebp, esp 1、分析参数:
00401033 sub esp, 44h
00401036 push ebx
00401037 push esi
00401038 push edi 2、分析局部变量
00401039 lea edi, [ebp - 44h]
0040103C mov ecx, 11h
00401041 mov eax, 0CCCCCCCCh
00401046 rep stos dword ptr[edi]
00401048 mov eax, [004225c4] 3、分析全局变量
0040104D mov dword ptr[ebp - 4], eax
00401050 mov ecx, dword ptr[ebp + 8]
00401053 cmp ecx, dword ptr[ebp + 0Ch]
00401056 jg 00401064
00401058 mov edx, dword ptr[ebp + 0Ch] 4、功能分析
0040105B add edx, dword ptr[ebp - 4]
0040105E mov dword ptr[004225c4], edx
00401064 pop edi
00401065 pop esi 5、返回值分析
00401066 pop ebx
00401067 mov esp, ebp
00401069 pop ebp
0040106A ret 6、还原成C函数
00401048 mov eax, [004225c4] 把004225c4
的值给eax
0040104D mov dword ptr[ebp - 4], eax 把eax的值给栈低-4的地方
00401050 mov ecx, dword ptr[ebp + 8] 把4给ecx
00401053 cmp ecx, dword ptr[ebp + 0Ch] if(ecx>5)
00401058 mov edx, dword ptr[ebp + 0Ch] 把5给edx
0040105B add edx, dword ptr[ebp - 4] 把edx加上eax全局变量的值
0040105E mov dword ptr[004225c4], edx 再把eax的值给 004225c4地址上