逆向入门(1)汇编学习———几种常见循环结构的学习

一.分析汇编之前要对汇编指令有一个基本的了解:

//指令 目的操作数 源操作数
mov:将操作数复制到目的操作数
jmp:无条件跳转到内存中的任何程序段
add:目的操作数=目的操作数+源操作数
cmp:比较指令 {
		目的操作数 < 源操作数 ZF=0 CF=1
		目的操作数 > 源操作数 ZF=0 CF=0
		目的操作数 = 源操作数 ZF=1 CF=0
		}
jge:大于或等于跳转指令这里与cmp配合使用
jl:小于跳转
push:PUSH 指令首先减少 ESP(栈顶指针) 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。
call:调用一个子过程
ptr:指针(pointer)

二.for循环结构

在for循环中,当定义变量i在循环之前时:

//C++代码
int main()
{
    int i = 0;
    
    for (i; i < 3;i++) {
        printf("%d",i);
    }
    return 0;
}

接下来是对汇编代码的分析:

//汇编代码
int i = 0;
00931925  mov         dword ptr [i],0  
    
    for (i; i < 3;i++) {
//跳转命令,直接跳转到判断命令,判断i的取值是否小于3
0093192C  jmp         __$EncStackInitStart+2Bh (0931937h)  
//将变量i的值赋值给eax
0093192E  mov         eax,dword ptr [i]
//eax加1  
00931931  add         eax,1
//将eax的值赋值给变量i
00931934  mov         dword ptr [i],eax  
//变量i和3比较
00931937  cmp         dword ptr [i],3  
//i>=3时执行该指令
0093193B  jge         __$EncStackInitStart+44h (0931950h)  
        printf("%d",i);
//将变量i的值赋值给eax
0093193D  mov         eax,dword ptr [i]  
//弹出eax
00931940  push        eax  
00931941  push        offset string "%d" (0937B30h)  
//执行输出指令
00931946  call        _printf (09310CDh)  
//esp加8
0093194B  add         esp,8  
    }
//跳回循环开头
0093194E  jmp         __$EncStackInitStart+22h (093192Eh)  
    return 0;
00931950  xor         eax,eax
其实三种循环的结构都差不多,其中for和while的结尾都是jump到开始,再次执行,只有do...while是条件转移。后面的代码也没有太多分析的必要了,毕竟只是熟悉一下各种循环的形式,写的很简单,大佬勿喷,请绕过!

三.while循环结构

int main()
{
    int i = 0;
    
    while (i < 2) {
        i = i + 1;
        printf("%d",i);
    }
    return 0;
}

接下来是汇编代码的分析:

int i = 0;
00F21925  mov         dword ptr [i],0  
    
    while (i < 2) {
00F2192C  cmp         dword ptr [i],2  
00F21930  jge         __$EncStackInitStart+42h (0F2194Eh)  
        i = i + 1;
00F21932  mov         eax,dword ptr [i]  
00F21935  add         eax,1  
00F21938  mov         dword ptr [i],eax  
        printf("%d",i);
00F2193B  mov         eax,dword ptr [i]  
00F2193E  push        eax  
00F2193F  push        offset string "%d" (0F27B30h)  
00F21944  call        _printf (0F210CDh)  
00F21949  add         esp,8  
    }
00F2194C  jmp         __$EncStackInitStart+20h (0F2192Ch) 

四.do…while循环结构

int main()
{
    int i = 0;
    
    do {
        i = i + 1;
        printf("%d", i);
    } while (i < 3);
    return 0;
}

接下来是汇编代码的分析:

int i = 0;
009B1925  mov         dword ptr [i],0  
    
    do {
        i = i + 1;
009B192C  mov         eax,dword ptr [i]  
009B192F  add         eax,1  
009B1932  mov         dword ptr [i],eax  
        printf("%d", i);
009B1935  mov         eax,dword ptr [i]  
009B1938  push        eax  
009B1939  push        offset string "%d" (09B7B30h)  
009B193E  call        _printf (09B10CDh)  
009B1943  add         esp,8  
    } while (i < 3);
009B1946  cmp         dword ptr [i],3  
009B194A  jl          __$EncStackInitStart+20h (09B192Ch)  
    return 0;
009B194C  xor         eax,eax  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值