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

实验楼截图

为了写作方便,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. 浅谈IT

    在没有学计算机应用技术之前我对IT的认知度几乎为零,曾经还天真的认为IT就是白领,只要做上IT行业,以后便可高枕无忧.后来阴差阳错学了这个专业.通过一年的学习,虽然学艺不精但多少对IT行业了解的一知半 ...

  2. UVALive - 6572 Shopping Malls floyd

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48416 Shopping Malls Time Limit: 3000MS 问题描述 We want to ...

  3. codeforces D. Queue 找规律+递推

    题目链接: http://codeforces.com/problemset/problem/353/D?mobile=true H. Queue time limit per test 1 seco ...

  4. std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义

    std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...

  5. Somebody That I Used to Know

    一.查看歌词 http://baike.baidu.com/view/7925491.htm 二.考量歌词 1.我告诉自己你就是我的挚爱 但你的陪伴却让我倍感孤单 但那就是爱 让我刻骨铭心难以忘怀 既 ...

  6. ObjectStore onFetch方法获取记录总数

    转自:http://blog.csdn.net/earthhour/article/details/38686029 ObjectStore onFetch方法获取记录总数 require(['doj ...

  7. jQuery1.9.1--attr,prop与val方法源码分析

    这里只介绍这几个方法的源码,这部分引用了一个技巧,钩子对象,用来做兼容fixed的对象,后面也有一些使用.钩子对象具体的兼容细节这里就不详解了. var nodeHook, boolHook, rcl ...

  8. 简单的说说jsonp

    jsonp和json有什么区别?json是一种文件格式,而jsonp是一种技术方法. jsonp会被人认为是一种新的跨域技术,其实本质上和利用带有src属性的标签进行js跨域本质没什么区别. 区别就是 ...

  9. Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)

    第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...

  10. php7 安装 及和php5的共存

    http://blog.csdn.net/liuxinmingcode/article/details/50319145 LNMP FastCGI 是一个可伸缩地.高速地在HTTP server和动态 ...