郑德伦 原创作品转载请注明出处 《Linux内核分析》MOOC课程
http://mooc.study.163.com/course/USTC-1000029000
首先创建一个C程序的文件,main.c
将一段C程序代码使用命令 gcc –S –o main.s main.c -m32编译成汇编代码。
我们删除点开头的辅助信息来得到汇编代码。

这样就可以清晰的看到main.c文件的汇编代码了。
根据汇编代码我们来一步一步分析程序在执行过程中堆栈的变化过程。
首先程序从main开始执行,最初的堆栈为空,esp和ebp指向同一个地址:

然后执行18:pushl %ebp, 保存旧的ebp地址,把旧的ebp地址压入堆栈,此时堆栈情况如下:

执行19: movl %esp, %ebp 将esp的值放入ebp中,执行之后堆栈的状态如下,此时ebp和esp又指向同一地址

执行20:subl $4, %esp 将esp的值减4,此时堆栈的情况如下:

执行21: movl $8, (%esp), 将立即数8放入esp所指向的地址中。此时堆栈情况如下:

执行22:call f, 将eip(23)压入栈中,然后跳转到f:处执行,此时堆栈情况如下:

执行9:pushl %ebp,将老的ebp地址压入栈中,此时堆栈情况如下:

执行10:movl %esp, %ebp,将esp的地址赋给ebp,此时堆栈情况如下:

执行11: subl $4, %esp, 将esp的值减4,此时堆栈的情况如下:

执行12:movl 8(%ebp), %eax, 将ebp + 8所存放的值,放入eax寄存器中,ebp+8存放的值为8,所以此时eax寄存器存放的值为8. 此时堆栈无变化
执行13:movl %eax, (%esp), 将eax寄存器存放的值,放入esp所执行的地址中。此时堆栈的变化如下:

执行14: call g, 将eip(15)压入堆栈,并且跳转到函数g执行,此时堆栈的变化如下:
执行2: pushl %ebp, 将老的ebp压入堆栈,此时堆栈的变化如下:

执行3: movl %esp, %ebp, 将esp存放的值放入ebp中。此时堆栈的变化如下:

执行4:movl 8(%ebp), %eax, 将ebp + 8所指向的内容放入eax寄存器中,ebp + 8存放的内容为8,所以eax寄存器存放的内容为8,此时堆栈无变化。
执行5: addl $11, %eax, 将eax寄存器的内容与11相加,并且将结果放入eax寄存器中, 此时eax寄存器为19。堆栈无变化
执行6:popl %ebp,将栈顶元素弹出,放入ebp寄存器中,即将old ebp还原。此时堆栈的变化如下:

执行7:ret, 程序将执行15行代码,此时堆栈变化如下:

执行15: leave 相当于
movl %ebp, %esp
popl %ebp
将ebp寄存器的值放入esp寄存器中,并且弹出栈顶元素,存放到ebp中。此时堆栈变化如下:

执行16:ret ,程序将执行23行代码,此时堆栈变化如下:

执行23: addl $7, %eax, 将eax寄存器的值加上7,并且将结果放入eax寄存器。
执行此指令前,eax寄存器的值为19(上面已经计算得出),执行之后,eax寄存器变为26,此时堆栈无变化
执行24:leave 相当于:
movl %ebp, %esp
popl %ebp
此时堆栈还原到最初的状态,如下图所示:

最后执行25: ret 程序退出。

通过分析前面的C程序的执行过程,可以看出计算机的执行过程,就是CPU读取一条一条的指令来进行执行,指令寄存器EIP就指向下一条需要执行的指令。
而编译器将高级语言的代码编译成CPU可以理解的二进制代码。任何复杂的程序,都最终变成一条条简单的计算机指令堆叠而成。
程序执行过程中一些数据的保存,大都是通过堆栈进行的。堆栈寄存器EBP和ESP共同确定了一个堆栈的栈底和栈顶。
通过本节课程学习,初步了解了一个C程序在指令级的运行方式,理解了程序在执行过程中,堆栈的变化过程。

通过分析一个C程序的汇编指令执行过程,理解计算机的工作。相关推荐

  1. 1.2.4 计算机的工作过程(从源程序到可执行文件、指令执行过程的描述)

    文章目录 1.计算机工作过程分为三步骤 2.从源程序到可执行文件 (1)预处理阶段 (2)编译阶段 (3)汇编阶段 (4)链接阶段 3.指令执行过程的描述 举个例子 (1)取指令:PC->MAR ...

  2. CPU结构与指令执行过程简介

    CPU(Central Processing Unit)是计算机中进行算术和逻辑计算处理指令的主要部件. CPU结构 CPU由通用寄存器组,运算器,控制器和数据通路等部件组成. 寄存器包括 数据寄存器 ...

  3. 6 计算机组成原理第五章 中央处理器 CPU功能和结构 指令执行过程

    文章目录 1 CPU功能和基本结构 1.1 CPU的功能 1.2 运算器的基本结构 1.3 控制器的基本结构 1.4 CPU基本结构 1.5 CPU的功能和基本结构小结 2 指令周期和数据流 2.1 ...

  4. CPU内部组成结构及指令执行过程

    计算机的基本硬件系统由运算器.控制器.存储器和输入.输出设备五大部件组成.运算器和控制器等部件被集成在一起统称为中央处理单元(Central Processing Unit,CPU). CPU的功能 ...

  5. 一个Job在OneFlow中的执行过程—下篇

    本文为<一个Job在OneFlow中的执行过程>系列文章的下篇,也是最后一篇.在之前的文章<一个Job在OneFlow中的执行过程-上篇>中,从bottom up的角度,简单讲 ...

  6. 一个Job在OneFlow中的执行过程—中篇

    上一篇文章<一个Job在OneFlow中的执行过程-上篇>,以bottom up的角度,简单讲解了一个Job(用户定义的训练/预测任务)在Oneflow中的调用入口.数据流转过程.从pyt ...

  7. 一条汇编指令是如何在计算机的硬件中进行执行的

    本文说明的是单纯的一般的计算指令从储存设备中取出来之后,运行时(取址,译码,执行,回写 -- 这些操作)在CPU和我们的主存之间的执行过程 以下,我们使用一条简单的指令进行引入,后续再添加其他的情况: ...

  8. 52.一文带你理解ARM程序的编译及执行过程

    一.我们的的程序是如何被芯片识别的? 有时我们会想,我们使用c语言或者更高级的语言写好代码,这些类似英文字母的东西芯片是怎么识别并且按照我们的想法执行的? 上图是一个ARM芯片基本的硬件组成,我们的程 ...

  9. 【计算机组成原理】指令执行过程

    机器周期和时钟周期 机器周期:又称CPU周期. 时钟周期:又称CPU时钟周期,是CPU操作的最基本单位. 指令周期 指令周期是CPU从主存中取出并执行一条指令的时间,不同指令的指令周期可能不同. 指定 ...

最新文章

  1. java培训有哪些收费标准
  2. Adobe Flash Professional cc2015中文版
  3. flask连接不到mysql数据库,即使使用了python flask mysql,也无法将数据提交到数据库(使用python flask mysql)连接.提交()...
  4. [Android] 任意时刻从子线程切换到主线程的实现
  5. SpringMVC-设置编码过滤器
  6. 基于matlab实现的人脸检测
  7. 电力电子单相交流调压电路实验,江南大学物联网工程学院,实验报告
  8. c语言课程设计2018,C语言课程设计报告(2018)——学生管理系统(17页)-原创力文档...
  9. beego 访问网络_Go--Beego新建项目(解决不能访问的问题)
  10. js分享微信 ,微博 ,qq空间
  11. R语言之数据分析高级方法「时间序列」
  12. EnvironmentLocationNotFound: Not a conda environment:
  13. I2S协议-一篇文章带你了解
  14. 【目标检测】SSD算法
  15. Eclipse连接SQLServer2008
  16. 计算机word虚线在哪里,在word中画虚线的五种方法
  17. 干货丨Kubernetes 中分析调试网络流量的4种方法
  18. 计算机中的right函数,right函数用法实例
  19. 软件缺陷定位☞西门子数据集介绍
  20. 淘宝开店历程-致广大新开淘宝店主

热门文章

  1. 关于for循环里边是否可以用return语句
  2. codeigniter 禁止ip登录_「开源资讯」baigo SSO v4.0 beta-3 发布,单点登录系统
  3. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
  4. Faster R-CNN论文笔记——FR
  5. Java 8新特性终极指南
  6. 详解Java中的clone方法 -- 原型模式
  7. Java 内存模型及GC原理
  8. 【LSH源码分析】p稳定分布LSH算法
  9. 日文 LaTeX 系统介绍 - 最简示例
  10. Python matplotlib pyplot中title() xlabel() ylabel()无法显示在中文(方框乱码)的解决办法