• 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地址上

  • 相关阅读:
    @SuppressWarnings("resource")
    连续根据两个字段排序
    java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
    java中数组的定义
    单表(多表需手动创建多个转换)插入,更新数据
    批量处理sql
    查询排序后前5名的信息
    面向对象详细
    Flask-SQLAlchemy
    Dbutils-数据库连接池
  • 原文地址:https://www.cnblogs.com/0x7e/p/13745178.html
Copyright © 2020-2023  润新知