由反汇编C程序来理解计算机是如何工作的

时间:2021-08-24 22:40:58

C语言代码

int g(int x) {
return x + 109;
} int f(int x) {
return g(x);
} int main() {
return f(122) + 3;
}

汇编代码的工作过程分析

g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $109, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
pushl 8(%ebp)
call g
addl $4, %esp
leave
ret
main:
pushl %ebp
movl %esp, %ebp
pushl $122
call f
addl $4, %esp
addl $3, %eax
leave
ret

实验楼截图

由反汇编C程序来理解计算机是如何工作的

为了写作方便,ebp,esp等扩展的寄存器在以下均写作为ep,sp等

首先,main函数为该程序的开始入口,所以从main函数开始分析:

  • 在line 17 ~ line 18是进入main函数(enter操作),其过程是:

    首先是 pushl %ebp 操作:sp-4,然后将当前bp的值放入sp所指向的内存区块,然后是movl %esp, %ebp:将esp的值赋值给ebp,这样bp和sp将指向同一个位置,就是重新指向了sp所指向的栈顶位置.
  • line 19操作将立即数122入栈,做好准备,以便于进行加法操作时使用.

在line 20开始调用f函数,这里开始对f函数进行分析:

  • call f完毕后,此时堆栈情况:sp(指向ip,ip指向cs中的f函数执行段),bp(指向sp前一个位置)
  • line 9 ~ line 10为enter操作,进入函数其操作过程同main函数的操作过程,经过完此时后状态将是,bp与sp指向同一个栈顶位置,此时sp中所指向的内容是bp在执行进入f函数的enter操作之前的bp的值(注意,这里的bp值和main函数中的bp值不一样).
  • 执行到line 11时,将bp加上8的值(即122的值)放入sp所指向的被分配的内存区块,为函数g的调用做准备.

在line 12是开始调用g函数,这里开始对g函数进行分析:

  • line 2 ~ line 3 执行enter操作,同f函数.
  • line 4 将bp+8的所指向的值放入ax中,即122,为下面的加法操作做准备.
  • line 5 将立即数109在ax中的值做加法操作,然后结果放入ax中.
  • line 6 弹出栈顶的ip,sp+4
  • line 7 返回g函数,执行完后,弹出栈顶的内容放入ip中,此时堆栈回到了调用函数g之前的状态,得到g(122)

回到f函数中:

  • line 13 ~ 15 执行后,堆栈恢复到函数f调用之,得到f(122)

最后,回到main函数:

  • line 21 ~ line 22 执行,sp+4, sp指向bp值(此bp的值为指向栈底的值),add $3, $eax ,ax中的存储的值+3
  • line 23 ~ line 24,main函数执行完毕,堆栈回到初始状态(sp,bp均指向栈底),返回计算值。

总结

通过分析这段C语言代码的汇编代码,可以得到计算机程序执行的几个特点:

  • 总是通过EIP取得下一段要执行的代码,然后执行该段代码,即总是取指执行
  • 当进行函数调用时,堆栈会保存调用函数之前的程序状态,同时堆栈指针bp和sp会在一个伪初始位置
  • 每次函数调用结束,堆栈指针bp和sp回复到调用之前的状态

署名信息

吴欣伟 原创作品转载请注明出处 《Linux内核分析》MOOC课程第一次大作业 课程主页:http://mooc.study.163.com/course/USTC-1000029000

由反汇编C程序来理解计算机是如何工作的的更多相关文章

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

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...

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

    秦鼎涛  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...

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

    姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  4. Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的

    首先,我们先写一个简单的C语言程序,如下: int g(int x) { return x +3; } int f(int x) { return g(x); } int main(void) { r ...

  5. 《Linux内核分析》第一周 计算机是如何工作的?

    刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK ONE(2. ...

  6. 《Linux内核分析》 第一节 计算机是如何工作的

    第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  7. linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作

    一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...

  8. Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理

    Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...

  9. Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理

    Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...

随机推荐

  1. java 多线程 Synchronized方法和方法块 synchronized&lpar;this&rpar;和synchronized&lpar;object&rpar;的理解

    synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized ...

  2. 逐个访问URL的每个查询字符串参数

    下面介绍一个函数,用于处理location.search的结果,以解析查询字符串,然后返回包含所有参数的一个对象. 比如  www.baidu.com?q=javascript&num=10 ...

  3. JS 处理十六进制颜色渐变算法-输入颜色,输出渐变rgb数组

    html颜色有几种表示方式: 英文单词颜色值:background-color:Blue:十六进制颜色值:background-color:#FFFFFF:  RGB颜色值三元数字:backgroun ...

  4. OSGi简介

    OSGi简介 OSGi是什么 下面来看看“*”给出的解释: OSGi(Open Service Gateway Initiative)有双重含义.一方面它指OSGi Alliance组织:另一方 ...

  5. VisualStudio2017集成GitHub

    1 概述 通过使用VisualStudio2017来编写C语言版本的helloworld程序,然后上传至GitHub 2 VisualStudio2017安装GitHub插件 前提条件: 必须完成Vi ...

  6. python文件(概念、基本操作、常用操作、文本文件的编码方式)

    文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...

  7. mysql数据库表设计小数类型

    float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效 ...

  8. log4j2日志xml配置——不同级别的日志分别记录在不同的文件

    <?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL ...

  9. 添加自己的discuz 的积分策略

    在参考了网上的一些文章和discuzx开发手册,开始操作:1.在数据库表pre_common_credit_rule增加一条记录,rulename填“填写推荐人”,action填“txtjr”(跟下面 ...

  10. BZOJ4650 &lbrack;NOI2016&rsqb;优秀的拆分 【后缀数组】

    题目 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆 分是优秀的.例如,对于字符串 aabaabaa,如果令 A=aabA=aa ...