c理c利用计算机怎么弹,通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的...

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

计算机的工作方式:

现代计算机的基本体系结构都是采用冯诺依曼结构,冯诺依曼的设计思想最重要之处是"存储程序"的这个概念。计算机的工作过程,就是执行程序的过程。首先编写需要执行的程序,然后通过输入设备送到存储器保存起来,即程序存储。根据冯诺依曼的设计,计算机应能自动执行程序,而执行程序又归结为逐条执行指令。执行一条指令又可分为以下4个基本操作:取出指令:从存储器某个地址中取出要执行的指令送到CPU内部的指令寄存器暂存。

分析指令:把保存在指令寄存器中的指令送到指令译码器,译出该指令对应的微操作。

执行指令:根据指令译码,向各个部件发出相应控制信号,完成指令规定的各种操作。

为执行下一条指令作好准备,即取出下一条指令地址。

接下来通过一个简单的c程序来分析一下,程序的执行过程

这里是一个非常简单的c程序,源代码如下:

ae6167ff4cb52213ca13f37b3445de03.png

输入:gcc S o main.s main.c m32 来生成汇编代码

整洁一下汇编代码以后,查看汇编代码:

108cc96f8dc8072581974f6d37f3a85c.png

我在我的虚拟机中的ubuntu系统与实验楼ubuntu系统的汇编代码有点不一样

6992331c4bdde1147cb1a8f1b79ed7f8.png

c97f27296b27a3eab54e3b636f91323f.png

下面通过gdb单步执行来分析栈上寄存器的情况:

首先我们从main函数开始。(前两条语句在gdb执行时设置不了断点,但是执行函数的语句都有这2条,放到其他函数来说明):

在main函数上先设置一个断点,然后运行:

886ba10a5751e1df4a4b975009074a0e.png

此时查看寄存器的值:

90413433ac7eb4d928e57c1ba9621d1a.png

他们的值:esp和ebp都是0xbffff568,eip是0x8048409(正好是下一条要执行的指令的地址)

接下来继续执行:

9b8596fe4b0f10b42c46b28efadcfc0e.png

把2压到栈上

56f0528a6a6825ba7b31839423cc89f5.png

40dc9c3c9795737d9715224ac5645226.png

此时,esp的减4了,而ebp不变,eip继续指向下一条指令

下一条要执行call指令,这里再对函数f设置一个断点,继续执行:

afc349859f45b4febfa0a12051c3a994.png

此时,程序跳到函数f中去了

call  f

调用函数 f,其实这条指令等价于

pushl %eip

movl  $f, %eip

eip的值被保存在esp-4的位置上,保存eip的目的是函数调用返回时能够继续执行call f下面的语句:

cbcbdf8ee270321f5c3fee4944fece1c.png

此时,esp的值为0xbffff560,ebp都是0xbffff568

跳转到函数f后,前两条语句和 main 函数相同,都是保存堆栈状态,这里详细来说明一下:

先把ebp的值保存咋esp-4的位置上

3abf0c4cc8e97e8bc3d52983b7d38aae.png

再把esp的值赋给sbp,此时esp和ebp的值都为0xbffff55c

436da4d160ba8a01f16d802de804af18.png

然后继续执行,把ebp+8的内容即2这个值压栈:

588b53a7096b99025c73c5c45603988f.png

此时esp继续-4

1a0a4ee0fb8404a33ba3111897d92d54.png

查看寄存器的值

604bbc794c6a200bbae5b5279e12aa23.png

寄存器的值:esp的值为0xbffff558,ebp的值为0xbffff55c,

接下来要跳转到函数g了,因此再对函数g设置一个断点,然后继续执行:

628610b87e2503a0059db588b281d4b5.png

观察寄存器的值:

317816ba5ab297255c5b2b7582d83190.png

同理:寄存器eip的值继续被保存了在esp-4的位置上,以便能够返回到函数f

34cf00bb97c7bb38a693b3e61fd51596.png

进入g函数老的ebp的值也被保存了,新的esp和ebp相同

2dc767f39af40e9f3139088683e83005.png

此时,esp和ebp的值都是0xbffff550

接下来继续执行,把ebp+8的值给eax

034a6a0df6abb46a790de68d70553042.png

查看寄存器,此时esp和ebp的值都是0xbffff550,eax的值是2

86d8989fb7536445983642f1445f580d.png

继续执行:

3a21db9510258ef8054d6668c76b91ec.png

把3和eax的值相加结果再保存到eax中

查看寄存器

54ea0edcb1f345612b52f60af51d787f.png

寄存器eax的值变成5了,esp和ebp的值都是0xbffff550

然后继续执行:

ac998cefd695d3beefdb7c4ce55c2886.png

把esp指向的值给ebp,查看寄存器

10ca44431e7465c5c523897279c83ada.png

寄存器的值:esp的值为0xbffff554,ebp的值0xbffff55c,eax还是5

然后继续执行:

ed696eace9cf38d71a8391d6427dd519.png

指令ret相当于指令popl %eip

b4df7d8359fa4476e676a5dd15dc4d44.png

esp的值为0xbffff558,ebp的值0xbffff55c,eax还是5

这样又返回到函数f继续执行:

aa07bad4a292a71b4a6d4aad0fd0343d.png

继续执行,然后查看寄存器:

051e9c080cde60c1aad0e21dd51b5364.png

Esp和ebp的值都是0xbffff55c,eax还是5

继续执行,leave,这条指令相当于下面两条指令:

movl  %ebp, %esp

popl  %ebp

查看寄存器

ce8cb4231557f90eccda819929abaa23.png

esp的值为0xbffff560,ebp的值0xbffff568,eax还是5

继续执行ret,弹出保存的eip的值,返回到main函数执行:

f85ecb1e0e87f5ba989c3b1164965f3a.png

查看寄存器的值,esp的值为0xbffff564,ebp的值0xbffff568,eax还是5

98eb8bc9e502b09ebe1005a9248e72ad.png

连续执行2步,继续执行

9f85a7b59a58cfaca5d3c271ef1ad8a9.png

此时eax的值变成了6,esp和ebp的值0xbffff568

12de514440cfa16420b5f3ea512670af.png

然后继续执行2步,main函数就返回了

055d7118327f58942bfdce3e7ca8c6af.png

总结

通过分析对应的汇编代码和观察运行栈的变化,加深了对程序执行过程的了解,也明白了计算机的工作方式:根据eip 指指令执行,同时eip自增;

如果执行的是跳转语句时,先把eip压栈,然后将需要跳转的目的地址赋给 eip,实现跳转;

若执行函数调用时,将 eip 压栈,同时将ebp压栈,然后将相应函数地址赋给 eip;

若为其他指令,则继续从 eip 指向的地址取指令执行。

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

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

相关文章

Linux安装MySQL的两种方法

原文链接:http://blog.csdn.net/superchanon/article/details/8546254 --------------------------------------------------------------------------------------- 1. 运行平台:CentOS 6.3 x86_64,基本等同于RHEL 6.3 2. 安装…

jenkins 手动执行_想知道如何用Jenkins自动执行Python脚本输出测试报告?

前言在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作。借助Jenkins,我们可以结合 Git/SVN 自动拉取代码,可以设置定时构建,接着就可…

VR 影院,约吗?

世界第一家 VR 影院已经开张,朋友,去不? 世界第一家 VR 影院正式开张 (无大屏的 VR 电影院) 在被称为 VR 元年的 2016 年,越来越多的人加入了这个新兴的领域,各种传统应用也在被 VR 包装之后以…

redis cluster 分布式锁_关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁...

首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法、变量。在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在jdk …

sp烘焙流程_小手雷-PBR材质流程(一)——(基本材质)

小手雷-PBR材质流程(一)Substance Painter生存手册经过了12个章节的讲解后,已经完结了(。・ω・。)相信大家经过了生存手册这一基础教程过后,对Substance Painter这款软件已经有了比较坚实的基础了,…

怎样呵护友谊_呵护真正的友情,助力漫长的人生

友情,即友谊,是指朋友和朋友之间的感情。它是一种很美妙的东西,可以让你在失落的时候变得高兴起来,可以让你走出苦海,去迎接新的人生。它就像一种你无法说出又可以感到快乐无比的东西。只有拥有真正朋友的人&#xff0…

【Day41】Python之路——AJAX

什么是AJAX AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 优点: 不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行 同源…

aes离线解密工具_如何在Python中解密OpenSSL AES加密文件?

OpenSSL为AES加密提供了一种流行的(但不安全 - 见下文!)命令行界面:openssl aes-256-cbc -salt -in filename -out filename.encPython以PyCrypto包的形式支持AES,但它只提供工具。如何使用Python / PyCrypto解密使用OpenSSL加密的文件&#…

VUE-搜索过滤器

VUE非常实用的搜索过滤&#xff0c;喜欢点个赞哦 废话不多说&#xff0c;先来看看效果 1 引入vue <script src"https://cdn.jsdelivr.net/npm/vue"></script>2 HTML <div id"app"><input v-modelsearch /><ul v-if"search…

单选按钮必填会有红色选中提示吗_为什么单选按钮和复选框不能共存?

以下内容由摹客团队翻译整理&#xff0c;仅供学习交流&#xff0c;摹客设计协作一站式云平台&#xff0c;从产品、设计到开发&#xff0c;摹客来解决。单选按钮和复选框长期以来一直都是容易导致用户困惑的组件。这两个组件通常用于相同的情景下&#xff0c;但看起来又完全不同…

程序包org.junit.jupiter.api不存在

在跑项目的时候遇到这个问题&#xff0c;去看pom文件一切正常&#xff0c;也引入了这个依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope&…

thrift介绍及应用(一)—介绍

原文&#xff1a;http://blog.csdn.net/guxch/article/details/12157151 ------------------------------------------------------------------------------------ 一、概述 Thrift是Apache下的一个子项目&#xff0c;最早是Facebook的项目&#xff0c;后来Facebook提供给Apa…

matlab双目相机标定校正_基于双目视觉的无人机避障算法(一)

讲述在10月到12月所做的所有工作对于一个无人机自主避障来说&#xff0c;存在着以下流程&#xff1a;感知&#xff1a;障碍物检测、行人检测、目标检测SLAM&#xff1a;为无人机提供位置估计&#xff0c;构建稀疏环境地图路径规划&#xff1a;规划一条从当前位置到目标位置的移…

计算机无法播放,如果无法播放计算机mp4文件怎么办?

FireStar365接受1. 下载并安装最新版本的视频播放器(例如: Storm Video).2. 在硬盘中找到MP4视频文件.3. 右键单击该文件&#xff0c;然后选择打开方法“ Storm Video”.4. 可以双击打开页面.zxc942128835将mp4链接到计算机&#xff0c;打开磁盘&#xff0c;单击菜单栏上的工具…

thrift介绍及应用(二)—简单应用

原文&#xff1a;http://blog.csdn.net/guxch/article/details/12162131 ----------------------------------------------------------------------------------- 【接上文“thrift介绍及应用&#xff08;一&#xff09;—介绍”】 六、一个最简单的实例 Thrift文件&#xf…

打游戏的教育意义

夜色已深&#xff0c;一个男孩子还在打游戏。门忽然开了&#xff0c;妈妈走了进来&#xff0c;她把一碗阳春面摆在桌子上。说&#xff1a;"歇息一会儿&#xff0c;趁热把这碗面吃了吧。"孩子嗯了一声&#xff0c;眼睛没有离开屏幕。妈妈生怕打搅孩子&#xff0c;悄悄…

标准评分卡分数计算原理_评分卡的形式、刻度及应用场景

&#xfeff; 看到有伙伴提问&#xff1a;①我们的评分卡做好后&#xff0c;后续的使用策略是什么呀&#xff0c;都有哪些方向&#xff1f; ②评分卡分数切割点如何定&#xff0c;制定的业务逻辑是什么&#xff1f;其实&#xff0c;这个问题不好回答&#xff0c;也好回答。一方…

hexeditor 复制二进制值_MySQL复制全解析 Part 6 MySQL GTID 生命周期

实验环境此次实验的环境如下MySQL 5.7.25Redhat 6.10操作系统账号:mysql数据库复制账号:repl复制格式:基于行的复制通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置基于GTID上一节的内容为GTID的格式和存储&#xff0c;这节根据官方文档我们说GTID的生命周…

自动ip的计算机共享打印,局域网内自动获取ip地址怎么设置打印机共享文件夹...

在局域网环境中,为了尽可能地节省办公成本,很多用户都会选择在局域网中架设、部署共享打印机,以便在单位的任何角落处都能方便、自如地进行打印操作。下面是学习啦小编为大家整理的关于局域网内自动获取ip地址怎么设置打印机共享文件夹&#xff0c;一起来看看吧!局域网内自动获…

高级数据分析1代码_用Python进行数据分析,让你一看就会

本书详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。虽然本书的标题是“数据分析”&#xff0c;重点却是Python编程、库&#xff0c;以及用于数据分析的工具。第1章 准备工作第2章 Python语法基础&#xff0c;IPython和Jupyter Notebooks第3章 …