C和汇编---while反汇编

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

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

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

相关文章

IPv6技术未来发展趋势

前言 人们对于采用综合技术&#xff0c;将数据、话音和视频等业务“一网打尽”梦想的追求从来都没有停止过。从上世纪80年代的综合业务数字网(ISDN)技术&#xff0c;到90年代的基于异步传输模式(ATM)的宽带ISDN&#xff0c;直到现在的IPMPLS(多协议标记交换)技术等。在这一过程…

栈的应用

1、括号匹配 如果是扫描到左括号&#xff0c;则入栈如果是扫描到右括号&#xff0c;则检查现在的栈顶元素&#xff0c;如果括号匹配&#xff0c;则栈顶元素出栈结束时&#xff0c;如果栈内没有元素&#xff0c;则括号匹配 bool Check(char *str){stack s;InitStack(s);int le…

Silverlight 布局控件

1.1. Canvas 在Canvas 布局中&#xff0c;控件使用Canvas.Top和Canvas.Left来定位内容: View Code 1 <Canvas x:Name"LayoutRoot" Background"White">2 <Button Name"SampleButton"3 Content"Sample Bu…

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

环境&#xff1a;VC for循环有三个表达式&#xff0c;第一个表达式是初始化&#xff0c;在for循环之前执行一次&#xff0c;后面就不执行了&#xff0c;第二个是循环条件&#xff0c;在执行循环体之前求值&#xff0c;如果为真&#xff0c;执行循环体&#xff0c;如果为假&…

韩国的计算机科学家,韩国科学技术院用普通相机为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的呢…

计算机机场基础知识,全国机场频率_电脑基础知识_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;任何程序在使用函…

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:…

cobaltstrike生成一个原生c,然后利用xor加密解密执行

首先cobaltstrike生成一个原生c&#xff0c;我的是&#xff1a; /* length: 797 bytes */ unsigned char buf[] "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c" "\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac…

这样就可以很方便的知道明天的天气了

今天在侧边栏加了一个实用的小东西——天气预报。它可以根据来访者的ip地址自动判断地区&#xff0c;并展现今天以及明天的天气预报。这样来看blog的时候就可以知道什么时候该去收衣服啦&#xff5e;哈哈&#xff01;实现代码其实很简单。就是套一个IFRAME&#xff0c;里面套个…

压缩矩阵

压缩矩阵&#xff1a;指为多个值相同的元素只分配一个存储空间&#xff0c;对零元素不分配存储空间特殊矩阵&#xff1a;指具有许多相同矩阵元素或零元素&#xff0c;并且这些相同矩阵元素或零元素的分配有一定规律性 1、对称矩阵 对称矩阵&#xff1a;矩阵每个元素都有aijaj…

线性方程组 python_线性方程组的表示 使用Python的线性代数

线性方程组 pythonPrerequisites: 先决条件&#xff1a; Defining a Vectors 定义向量 Defining a Matrix 定义矩阵 In this article, we are going to learn how to represent a linear equation in Python using Linear Algebra. For example we are considering an equatio…

初步体验数据驱动之美---TreeView

1.前言继上一篇《WPF应用基础篇---TreeView》的发布之后&#xff0c;有部分朋问我关于里面一些基础应用的问题&#xff0c;可能是我写得不够详细&#xff0c;所以在这里&#xff0c;我想再次那文章中的案例来谈谈初步体验数据驱动之美&#xff0c;摆脱旧WinForm编程习惯(靠触发…

不可以!

描述 判断&#xff1a;两个数x、y的正负性。 要求&#xff1a;不可以使用比较运算符&#xff0c;即”<”,”>”,”<”,”>”,””,”!”。 输入 有多组数据&#xff0c;每组数据占一行&#xff0c;每一行两个数x&#xff0c;y。 x、y保证在int范围内。 输出 …

树的基本概念

0x01 树 树&#xff1a;n个结点的有限集合&#xff0c;n0&#xff0c;空树任何非空树只有一个根结点n个结点的树只有n-1条边&#xff08;除根结点&#xff0c;每个结点只有一个前驱&#xff0c;一个前驱一条边&#xff0c;根据这个算的&#xff09;有序树与无序树&#xff1a;…

小学计算机教学教师培训,例谈小学信息技术课堂的有效教学

例谈小学信息技术课堂的有效教学在社会的各个领域&#xff0c;大家都不可避免地会接触到论文吧&#xff0c;论文可以推广经验&#xff0c;交流认识。为了让您在写论文时更加简单方便&#xff0c;以下是小编整理的例谈小学信息技术课堂的有效教学的论文相关内容&#xff0c;供大…