C和汇编-----for循环

环境: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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

茵茵的第一课

描述 茵茵今年已经六年级了&#xff0c;爸爸给她报了一个学习程序设计的班。 第一节课上&#xff0c;老师讲的就是如何输入一个数&#xff0c;再原样输出出来。 以现在的你看来&#xff0c;挺容易的是不&#xff1f; 那么&#xff0c;就请你也写出一个一样的程序吧 输入 第一…

python 立方体_Python | 创建三个数字列表,分别是正方形和立方体

python 立方体Take a range i.e. start and end, and we have to create three lists, list1 should contains numbers, list2 should contain squares of the numbers and list3 should contain cubes of the numbers in Python. 取一个范围&#xff0c;即开始和结束&#xff…

WPF关于WindowInteropHelper的一个BUG

在Windows SDK中关于WindowInteropHelper类的介绍中&#xff0c;关于其Owner属性的说明和实现有些问题。 原文是&#xff1a;An example scenario is if you need to host a WPF dialog box in a Win32 application. Initialize the WindowInteropHelper with a WPF window obj…

韩国的计算机科学家,韩国科学技术院用普通相机为AR/VR复刻真实世界物理对象...

只需一个包含闪光灯的相机/摄像头(映维网 2018年12月10日)为虚拟环境捕捉和复刻逼真的现实世界对象十分复杂&#xff0c;而且耗时。所以&#xff0c;从移动设备和数码相机&#xff0c;你能想象只通过一个包含内置闪光灯的传统相机来简化这个任务吗&#xff1f;一支全球化的计算…

C和汇编混合编程---do while

环境&#xff1a;VC do while 会先执行do里面的循环体&#xff0c;执行完去执行while的条件判断&#xff0c;如果为真&#xff0c;继续执行do里面的循环体&#xff0c;如果为假&#xff0c;则结束循环 C程序&#xff1a; #include "stdio.h" int main() {int i1,su…

林子大了,什么鸟都有----.NET运用String的十八层境界

林子大了&#xff0c;什么鸟都有----.NET运用String的十八层境界 在上一文中&#xff0c;提到了一句相当常见但十分荒谬的代码&#xff1a;Request.QueryString["id"].ToString()。突然涌起一个想法&#xff0c;为什么不总结一下不同层次.Net开发者如何运用string的呢…

kotlin 查找id_Kotlin程序在矩阵中查找偶数和奇数的频率

kotlin 查找idGiven a matrix, we have to find frequencies of even and odd numbers. 给定一个矩阵&#xff0c;我们必须找到偶数和奇数的频率。 Example: 例&#xff1a; Input:matrix:[4, 5][6, 0][9, 2]Output:Even Elements Frequency : 4Odd Elements Frequency : 2在…

函数“”的返回类型不符合 CLS

林子在了啥鸟都有&#xff01;怎么出这种错误了。 转载于:https://www.cnblogs.com/nanshouyong326/archive/2007/04/23/723457.html

The Famous Clock(著名的钟)

描述 Mr. B, Mr. G and Mr. M are now in Warsaw, Poland, for the 2012’s ACM-ICPC World Finals Contest. They’ve decided to take a 5 hours training every day before the contest. Also, they plan to start training at 10:00 each day since the World Final Conte…

计算机机场基础知识,全国机场频率_电脑基础知识_IT计算机_专业资料

全国机场频率_电脑基础知识_IT计算机_专业资料 (13页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;14.9 积分机场频率2009-11-28 15:29:251分类&#xff1a;默认分类I举报I字匕订阅中国主要机场管制…

c和汇编---函数

环境&#xff1a;VC 作用&#xff1a; 函数是完成特定任务的独立程序代码单元 1、创建和使用函数 函数原型&#xff1a;声明函数是什么类型&#xff0c;指明函数的返回值和函数接收的参数类型&#xff0c;函数和变量一样&#xff0c;有多种类型&#xff0c;任何程序在使用函…

Ajax_ASP.NET 添加 Ajax 和客户端功能_01

现在&#xff0c;基于不同开发思想的前端 Ajax 框架越来越多&#xff0c;功能越来越强大&#xff0c;UI 越来越炫&#xff0c;但随之复杂度也越来越高&#xff0c;尤其是UI做得漂亮的&#xff0c;比如 Ext.Net。 可是无论框架多么复杂&#xff0c;思想都一样的。因为&#xff0…

计算机常用英语1000个,1000个常用英语单词.pdf

[键入文字 ]常用英语单词 2000 个One 16 as [ ?z, ? z] ad. 同样地 prep. 当作conj. 随着 ; 因为1 the [e?, ei: ] art. 这&#xff0c;那 ad.[ 用于比17 not [n?t] ad. 不&#xff0c;没&#xff0c;不是较级&#xff1b;最高级前 ]18 on [?n] prep. 在 …上&#xff1b;…

三角形面积

描述 给你三个点&#xff0c;表示一个三角形的三个顶点&#xff0c;现你的任务是求出该三角形的面积 输入 每行是一组测试数据&#xff0c;有6个整数x1,y1,x2,y2,x3,y3分别表示三个点的横纵坐标。&#xff08;坐标值都在0到10000之间&#xff09; 输入0 0 0 0 0 0表示输入结…

python投骰子程序代码_用于双骰子(一个偏向一个法线)仿真的Python程序

python投骰子程序代码Here, we will be simulating the occurrence of the sum of the faces of two dice [i.e. dice(A) - 1, 2, 3, 4, 5 ,6 dice(B) - 1, 2, 3, 4, 4, 4, 5, 6, 6 ,6]. A dice is normal(each has an equal probability of occurrence) and another B dice i…

如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案[上篇]

一、提出问题 在开发一个企业级 应用的时候&#xff0c;尤其在一个涉及到敏感数据的应用&#xff0c;比如财务系统、物流系统&#xff0c;我们往往有这样的需求&#xff1a;对于数据库中每一笔数据的添加、修改和删除&#xff0c;都需要有一个明确的日志&#xff0c;以便我们可…

执行shellcode的几种方式

首先写出汇编成功弹出计算器 #pragma comment(linker,"/section:.data,RWE") //data段可读写#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //不显示窗口#pragma comment(linker,"/INCREMENTAL:…

介绍针对企业级Flex开发的开源项目FlexibleShare

http://code.google.com/p/flexibleshare/ http://integratedsemantics.org/2009/05/19/flexibleshareair-dashboardportal-for-alfresco-livecycle-build1-available/ http://anvilflex.com/ 近日&#xff0c;开源的企业内容管理&#xff08;ECM&#xff09;系统供应商Alfresc…

取石子(七)

描述 Yougth和Hrdv玩一个游戏&#xff0c;拿出n个石子摆成一圈&#xff0c;Yougth和Hrdv分别从其中取石子&#xff0c;谁先取完者胜&#xff0c;每次可以从中取一个或者相邻两个&#xff0c;Hrdv先取&#xff0c;输出胜利着的名字。 输入 输入包括多组测试数据。 每组测试数…

html判断是安卓还是苹果手机,网页能够自己判断是pc端首页还是手机android和苹果。...

代码调用方式一 ( 推荐 兼容性好) 第一步&#xff1a; script typetext/javascript srcswfobject.js/script 第二步&#xff1a; p idplayera href/go/getflashplayerGet the Flash Player/a to see this player./p 第三步&#xff1a; var s7 new SWFObject(FlvPlayer2010.sw…