环境:VC++

for循环有三个表达式,第一个表达式是初始化,在for循环之前执行一次,后面就不执行了,第二个是循环条件,在执行循环体之前求值,如果为真,执行循环体,如果为假,循环结束,第三个是执行更新,在每次执行完循环体后执行。下面用个简单的程序来研究for循环的反汇编

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

功能是求1到100的和

反汇编:

5:        int sum=0;
00401028 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0
6:        for(int i=1;i<=100;i++)
0040102F C7 45 F8 01 00 00 00 mov         dword ptr [ebp-8],1
00401036 EB 09                jmp         main+31h (00401041)
00401038 8B 45 F8             mov         eax,dword ptr [ebp-8]
0040103B 83 C0 01             add         eax,1
0040103E 89 45 F8             mov         dword ptr [ebp-8],eax
00401041 83 7D F8 64          cmp         dword ptr [ebp-8],64h
00401045 7F 0B                jg          main+42h (00401052)
7:        {8:            sum+=i;
00401047 8B 4D FC             mov         ecx,dword ptr [ebp-4]
0040104A 03 4D F8             add         ecx,dword ptr [ebp-8]
0040104D 89 4D FC             mov         dword ptr [ebp-4],ecx
9:        }
00401050 EB E6                jmp         main+28h (00401038)
10:       printf("sum=%d\n",sum);
00401052 8B 55 FC             mov         edx,dword ptr [ebp-4]
00401055 52                   push        edx
00401056 68 1C 20 42 00       push        offset string "sum=%d\n" (0042201c)
0040105B E8 30 00 00 00       call        printf (00401090)
00401060 83 C4 08             add         esp,8
11:       return 0;
00401063 33 C0                xor         eax,eax
12:   }

从上面的程序我们可以看出mov dword ptr [ebp-8],1相当于int i =1;从反汇编的角度看,这个也执行了一次,按照for循环的执行过程,接下来应该是i<=100,上面反汇编对应程序:

00401041 83 7D F8 64          cmp         dword ptr [ebp-8],64h
00401045 7F 0B                jg          main+42h (00401052)

比较i和100,如果大于,则跳到00401052执行,跳出循环,如果为小于等于,则执行

00401047 8B 4D FC             mov         ecx,dword ptr [ebp-4]
0040104A 03 4D F8             add         ecx,dword ptr [ebp-8]
0040104D 89 4D FC             mov         dword ptr [ebp-4],ecx

相当于 sum+=i;
循环体执行完就应该执行`i++了,jmp调到00401038执行

00401038 8B 45 F8             mov         eax,dword ptr [ebp-8]
0040103B 83 C0 01             add         eax,1
0040103E 89 45 F8             mov         dword ptr [ebp-8],eax

这个就相当于i++,接着执行i<=100,循环下去。
C和汇编代码:

#include "stdio.h"int main()
{char *str="sum=%d\n";__asm{//相当于int sum=0;mov ebx,0//相当于 int i=1mov eax,1//相当于i<=100
ee:     cmp eax,100jg end//相当于 sum+=iadd ebx,eax//相当于 i++inc eaxjmp ee//相当于 printf
end:    push ebxpush strcall printfadd esp,8}return 0;
}

C和汇编-----for循环相关推荐

  1. x86汇编_循环左/右移_带进位的循环左/右移_笔记48

    英文全称 汇编指令 中文翻译 说明 Rotate Left ROL 循环左移 目标操作数循环向左移,最后一个被移出来的数字放入CF标志位,同时循环回最右边(LSB). Rotate Right ROR ...

  2. C51 汇编 双层循环延时代码

    --------------------------------------------- -- 时间:2018-10-29 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  3. 16位汇编 loop循环

    loop循环,计算2的8次方 assume cs:codesgcodesg segmentmov ax,2mov cx,7s:add ax,axloop smov ax,4c00hint 21Hcod ...

  4. Intel汇编-LOOP循环检查ECX含零值

    # An example of the loop instruction # loop                循环直到ECX为零 # loope/loopz            循环直到EC ...

  5. 汇编学习---循环结构程序设计

    题目要求: 编程实现计算1~100的和,并将结果保存在字类型的result 变量中. 题目分析: 此题为一典型的循环结构设计题目,只需设定一个100的循环变量,依次递减1,然后累加即可. 代码实现: ...

  6. 控制语句(if-else+循环+switch)汇编规则

    [1]说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出) ZF:零标志 SF:符号标志(结果为负数) OF:溢出标志 (补码溢出, 有符号溢出) [2]有两类指令设置条件码而不改变任何其 ...

  7. 汇编分析golang循环

    女主宣言 今天小编为大家分享一篇关于Golang循环汇编分析的文章,文章中介绍了golang循环的汇编层面的处理,通过分析,我们可以更了解循环的实现.希望能对大家有所帮助. PS:丰富的一线技术.多元 ...

  8. 嵌入式_常见延时方式的差异与选择(for循环延时、定时器延时、汇编延时....)

    嵌入式_常见延时方式的差异与选择(for循环延时.定时器延时.汇编延时-) 这里整理几种常见的延时方式,并做简单测试供大家参考,如果有什么不对的地方,欢迎指正,共同探讨. 文章目录 嵌入式_常见延时方 ...

  9. 汇编学习教程:循环和CX寄存器

    引言 在上面博文中,我们主要学习了BX寄存器配合DS寄存器完成内存访问,同时也探究了Masm编译器面对弱指定和强指定两种情况时所产生的不同编译结果. 我们提到:xx:[idata] 是强指定格式,这种 ...

最新文章

  1. 系统设计经典题:手把手教你搭建一个IM(即时通讯) 系统
  2. python进程池multiprocessing.Pool运行错误:The freeze_support() line can be omitted if the program is not g
  3. 十个行为把你变成糟糕的程序员
  4. Activity的常用方法和生命周期
  5. html 属性中嵌套php,如何在PHP中使用嵌套数组创建HTML数据属性字符串?
  6. emmet插件使用(Css)
  7. 修改mysql用户家目录,Linux 更改MySQL目录
  8. 一次难忘的 MTS 故障的排除过程
  9. (74)FPGA模块调用(VHDL调用VHDL)
  10. wegame地下城不显示服务器,在电脑端wegame看不到旭旭宝宝?来吧我教你! - 地下城与勇士掌游宝...
  11. python导出exe文件不依赖环境_Python生成了不依赖dll的exe | 学步园
  12. jetty java 实例_java 在Jetty9中使用HttpSessionListener和Filter实例详解
  13. .net weka ikvm java
  14. 【印刷数字识别】基于matlab OCR识别系统【含Matlab源码 438期】
  15. phpcms二次开发摘要
  16. java 定时任务表达式(网络总结)
  17. Android开发之十二:Camera成像原理介绍
  18. 【修电脑】每次关机提示rundll32.exe程序没有响应,修改注册表解决问题
  19. 【转】那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
  20. 新手轻松日赚300+搬砖项目详解

热门文章

  1. 页面刷新 vuex 数据重新被初始化
  2. JS设计模式(2)策略模式
  3. 精美的手机界面设计素材和线框图设计工具推荐
  4. require.context
  5. Cmder - 在右键菜单添加Cmder Here
  6. Hessian 源码简单分析
  7. 使用jdk压缩war包
  8. IIS7 MVC网站生成、发布
  9. SVN+AnkhSVN端配置
  10. CISSP的成长之路(二十一):用户持有凭证