一起来学反汇编-之if语句

最近,为了深入学习学C++的语法,不知不觉又涉及到反汇编的范畴里,和大家一起分享反汇编的学习。


PS:最近真是郁闷,本来想着学directX,然后又觉得应该先扎实GDI;学着GDI,又得先熟悉C++的面向对象;要精通C++语法的内部原理,又得学会看反汇编。结果到反汇编来了...



部分知识参照上篇的 《图解“{”》

这次来学习if语句反汇编之后的内容,首先来个源码:

if(a>50 && a<100)                //其中a为第一个局部变量
     {
         printf("The number is %d/n",a);
     }
     else if(a<=50)
    {
         printf("Too small!/n"); 
     }
    else
    {
          printf("Too large!/n");
    }

Od反汇编后:

1.CMP DWORD PTR SS:[EBP-4],32a50(32h)比较  SS:[EBP-4]为什么是a,不明看《图解“{”》

2.JLE SHORT Console.00401085;不大于则跳到11 (else部分)

3.CMP DWORD PTR SS:[EBP-4],64a100(64h)比较

4.JGE SHORT Console.00401085;不小于则跳到11(else部分)

5.MOV ECX,DWORD PTR SS:[EBP-4];将a送到ecx寄存器

6.PUSH ECX;讲ecx(a的值)压栈,作为printf的右一参数

7.PUSH OFFSET Console.??_C@_0BC@MJDO@The?5numbe>

         ; 将静态变量区的 “the number is %d/n”字符串压栈作为右二参数

8.CALL Console.printf; 调用printf函数

9.ADD ESP,8;恢复调用前的栈(即将从栈中去掉之前两个参数,2*4字节)

10.JMP SHORT Console.004010A7 if语句执行后,跳到20行(退出整个if语句)

11.CMP DWORD PTR SS:[EBP-4],32 a50(32h)对比

12.JG SHORT Console.0040109A;大于则跳到17 (第二个else部分)

13.PUSH OFFSET Console.??_C@_0M@JFPO@Too?5small?>; “too small!/n”

14.CALL Console.printf; 调用printf函数

15.ADD ESP,4; 恢复函数调用前的栈

16.JMP SHORT Console.004010A7跳到20行(退出整个if语句)

17.PUSH OFFSET Console.??_C@_0M@FPJP@Too?5large?>; “too large!/n”

18.CALL Console.printf; /printf

19.ADD ESP,4; 恢复函数调用前的栈

20.之后的语句

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值