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

计算机的工作方式:

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

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

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

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

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

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

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

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

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

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

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

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

此时查看寄存器的值:

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

接下来继续执行:

把2压到栈上

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

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

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

call  f

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

pushl %eip

movl  $f, %eip

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

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

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

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

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

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

此时esp继续-4

查看寄存器的值

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

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

观察寄存器的值:

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

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

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

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

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

继续执行:

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

查看寄存器

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

然后继续执行:

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

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

然后继续执行:

指令ret相当于指令popl %eip

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

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

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

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

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

movl  %ebp, %esp

popl  %ebp

查看寄存器

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

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

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

连续执行2步,继续执行

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

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

总结

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

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

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

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

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

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

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  2. bat 删除文件_利用电脑文本文档建立一个简单方便的删除文件的小程序

    删除文不需要的文件或者资料,是日常工作中必定会遇到了. 各种的杀毒软件或者防护软件都具备删除文件的功能,例如360.腾讯电脑管家.这些操作起来其实也不是太麻烦! 不过呢!今天来和大家分享一个更简单的方 ...

  3. 利用WCF的callback机制开发一个简单的多人游戏模型

    本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...

  4. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  5. 从入门到入土:基于C语言采用TCP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. 看不到工作组的其他计算机_就这一次,从现实世界的角度去理解计算机领域的知识(给新手)...

    这篇文章的阅读对象是计算机专业在读及刚进入工作一年左右的的同学,文章措辞也许不太严谨,主要目的是为了让大家更容易理解. 01 便利店背后的"系统" "系统"这个 ...

  7. linux c语言反汇编分析,通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作...

    刘子健原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000对一下代码进行反汇编分析:in ...

  8. 利用MFC调用libvlc.dll作一个简单的播放器

    简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了. 2009.10.29修改:加入c ...

  9. 干货 | 利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码解析)

    作者 | Jose Garcia 翻译 | 吴振东 校对 | 张一豪 来源 | 数据派THU(DatapiTHU ) 数字图像处理(DIP)技术目前发展非常迅速,这在很大程度上要归功于开发人员可以访问 ...

最新文章

  1. FlameScope 更高级全面的火焰图
  2. squid一些其它配置
  3. socket与http
  4. python——常用的内置函数
  5. html5添加到安卓桌面图标,Android向桌面添加快捷方式,使其指向特定的网页
  6. 自己编写jQuery插件之表单验证
  7. 为什么人会摆高姿态_Yo , 你为什么喜欢冲浪?
  8. 软件工程第八次作业——例行报告
  9. 《浪潮之巅》完全系类——IT人士必读经典
  10. C++求复数的角度_高考数学一轮复习33,复数,常见类型及解题策略
  11. 证件照的背景颜色转换
  12. Emulex:融合是一切发展的基础
  13. Access数据库修复 压缩
  14. Microsoft.NET Framework 3.5Service Pack1下载Windows功能失败原因
  15. 精密制造业行业_精密制造业的发展:精密制造业的深度报告
  16. 登录页面(使用数据库)
  17. java useragent 360 遨游 火狐_Chrome与火狐修改浏览器User Agent教程
  18. 基于Java毕业设计疫情下的居民管理系统源码+系统+mysql+lw文档+部署软件
  19. 微信小程序电商实战项目
  20. C语言使用CUDA中cufft函数做GPU加速FFT运算,与调用fftw函数的FFT做运算速度对比

热门文章

  1. RuntimeException:java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not fonud
  2. 想学好C语言?先把基础打好再说吧!
  3. eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)
  4. protobuf版本常见问题
  5. 使用百度云智能SDK和树莓派搭建简易的人脸识别系统 Python语言版
  6. python类定义的讲解_python面向对象、自定义类等使用实例讲解
  7. tidb 配置mysql数据源_安装tidb数据库
  8. 北方人思想为什么落后_广西人为什么很少到北方打工?
  9. 二本考北航计算机经历,我(来自二本学校)考上北航的一些经历
  10. MIP 组件库升级公告