环境:VC++
C程序:

#include "stdio.h"int main()
{int i=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);return 0;
}

用while计算1到100的值,功能很简单,让我们看看反汇编
首先在main函数的入口,看到一条汇编不懂意思

0040101C B9 12 00 00 00       mov         ecx,12h
00401021 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401026 F3 AB                rep stos    dword ptr [edi]

查了资料,知道了

  • rep指令:重复stos dword ptr [edi]指令.ECX的值是重复的次数,每次ECX都会减一,到0就不执行了
  • stos:将eax中的值拷贝到ES:EDI指向的地址,也就是上面的dword ptr [edi]
  • es:附加段寄存器,存放当前执行程序中一个辅助数据段的段地址
    我们利用VC++反汇编可以查看一下,当执行了一次rep stos dword ptr [edi]命令后

    while的反汇编程序:
5:        int i=1,sum=0;
00401028 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1 //栈中[ebp-4]的值为1
0040102F C7 45 F8 00 00 00 00 mov         dword ptr [ebp-8],0//栈中[ebp-8]的值为0
6:        while(i<=100){00401036 83 7D FC 64          cmp         dword ptr [ebp-4],64h //比较i和100的值
0040103A 7F 14                jg          main+40h (00401050)  //大于跳转到00401050执行
7:            sum+=i;
0040103C 8B 45 F8             mov         eax,dword ptr [ebp-8]
0040103F 03 45 FC             add         eax,dword ptr [ebp-4] //相加
00401042 89 45 F8             mov         dword ptr [ebp-8],eax //[ebp-8]相当于sum
8:            i++;
00401045 8B 4D FC             mov         ecx,dword ptr [ebp-4]
00401048 83 C1 01             add         ecx,1
0040104B 89 4D FC             mov         dword ptr [ebp-4],ecx
9:        }
0040104E EB E6                jmp         main+26h (00401036)  //执行100次之后跳转到00401036执行
10:       printf("%d\n",sum);
00401050 8B 55 F8             mov         edx,dword ptr [ebp-8]
00401053 52                   push        edx
00401054 68 1C 20 42 00       push        offset string "%d" (0042201c)
00401059 E8 32 00 00 00       call        printf (00401090)
0040105E 83 C4 08             add         esp,8

执行一个函数,程序会先把ebp的值压入栈,把esp赋值给ebp

  • jg:大于跳转指令

反汇编实现:

#include "stdio.h"int main()
{/*int i=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);*/char *str="sum=%d\n";__asm{mov eax,1mov ebx,0mov ecx,1sum   :   cmp ecx,100jg endadd ebx,eaxinc eaxinc ecxjmp sumend :  push ebxpush strcall printfadd esp,8}return 0;}

C和汇编---while反汇编相关推荐

  1. 你知道汇编与反汇编的区别吗?

    本人不才,小白一枚,今天在看书的过程中被汇编.反汇编这两个词搞懵了.赶紧用了搜dog,发现讲的都不是很清楚,这里说一下我的总结.有什么不对的大家见谅. 汇编.反汇编这两个词可做动词,可做名词. 我们先 ...

  2. C/C++源程序到可执行程序exe的全过程(及汇编和反汇编的区别)

    一个现代编译器的主要工作流程如下: 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code ...

  3. riscv汇编对应C语言,riscv 汇编与反汇编

    为了riscv指令集,我们需要汇编与反汇编工具来分析指令格式. riscv-none-embed-as.exe -c mm.s -o mm.o --march=rv32g mm.s addi x10, ...

  4. java opcode 反汇编,OPCode详解及汇编与反汇编原理

    1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的 ...

  5. OPCode详解及汇编与反汇编原理

     1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处 ...

  6. unicorn模拟android,汇编与反汇编神器Unicorn

    我们来先说说Unicorn有啥子卵用. Unicorn 是一款非常优秀的跨平台模拟执行框架,该框架可以跨平台执行Arm, Arm64 (Armv8), M68K, Mips, Sparc, & ...

  7. GNU ARM汇编伪操作(Directives) 命令集

    本文是原创,转载请注明出处 本文链接:http://blog.sina.com.cn/s/blog_574d08530100hzie.html 1.符号定义伪操作 操作符      语法格式      ...

  8. 把 汇编代码翻译成二进制机器代码

    本文链接: http://blog.sina.com.cn/s/blog_574d08530100i0aj.html 汇编:把 汇编代码翻译成二进制机器代码 反汇编:把二进制机器代码翻译成汇编代码 汇 ...

  9. 嵌入式Linux(二)汇编LED驱动实验

    目的: 并不是系统的学习汇编,而是在linux开发中有时候需要使用汇编置零进行一些初始化的工作. 1. I.MX6ULL的IO初始化流程: 6ULL的IO命名:IOMUXC_SW_MUC_CTL_PA ...

最新文章

  1. Spring AOP 实现原理与 CGLIB 应用
  2. flink搭建集群(一主三从)
  3. arm linux 开机电路_【技术角度看问题之一】ARM到底是个啥?
  4. layui响应式:隐藏与显示(class 类名后缀)
  5. 95-136-042-源码-Operator-AbstractUdfStreamOperator
  6. 自定义广播增加权限控制
  7. CSS3动画实现牛顿摆
  8. Python中使用print函数的三种输出方式
  9. Web of Science的正确打开方式
  10. php 模态框效果,超酷的模态框效果 - Nifty
  11. MacOS代理设置(桌面应用代理设置Terminal代理设置)
  12. 谁是合约届「技术之王」?
  13. 系统分析师论文5:论软件的系统测试及其应用
  14. SQL Server 数据库文件类型
  15. 2019十佳DevOps工具,你用了几个?
  16. 伪全息老婆制作1(Shader入门1)
  17. C++的学习日记day8(类型转换、异常、输入输出流、文件)
  18. Anylogic各个版本的功能对比
  19. TUH EEG seizure数据集TUSZ v1.5.2和v2.0都有
  20. windows虚拟机安装打印机的方式

热门文章

  1. OpenDaylight开发hello-world项目之开发工具安装
  2. OO第二单元作业总结
  3. No identities are available for signing 的解决办法
  4. iview 级联选择组件_使用 element-ui 级联插件遇到的坑
  5. linux内核percpu变量声明,Linux kernel percpu变量解析
  6. 前端微信签名验证工具_微信小程序API 用户数据的签名验证和加解密
  7. 华为杯大学生计算机软件大赛,关于举办2018年西安电子科技大学程序设计网络赛暨第十六届“华为杯”大学生程序设计竞赛的通知...
  8. java script this_JavaScript this 关键字
  9. python 比较运算符放在列表中_在Python3中将运算符放在列表中
  10. 华为怎么升级Android11,华为EMUI 11/安卓11升级名单曝光 快来看看你的手机是否支持...