由反汇编C程序来理解计算机是如何工作的
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程序来理解计算机是如何工作的的更多相关文章
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http: ...
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
秦鼎涛 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...
- 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
首先,我们先写一个简单的C语言程序,如下: int g(int x) { return x +3; } int f(int x) { return g(x); } int main(void) { r ...
- 《Linux内核分析》第一周 计算机是如何工作的?
刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK ONE(2. ...
- 《Linux内核分析》 第一节 计算机是如何工作的
第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
- Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理
Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...
- Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理
Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...
随机推荐
- WPF中的Style(风格,样式)(转)
在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而 ...
- SSIS 控制流和数据流(转)
理解控制流和数据流的一个入口是看他们如何运行的.一个控制流任务是一个最小的执行单位,它的运行结果有成功,失 败,和完成,在运行它的下一个任务之前必须得到这些结果.在数据流任务中,转换时最基本的元素.一 ...
- CROC 2016 - Elimination Round (Rated Unofficial Edition) D. Robot Rapping Results Report 拓扑排序+二分
题目链接: http://www.codeforces.com/contest/655/problem/D 题意: 题目是要求前k个场次就能确定唯一的拓扑序,求满足条件的最小k. 题解: 二分k的取值 ...
- hdu 3123 GCC 阶乘
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123 The GNU Compiler Collection (usually shortened t ...
- HTTP1.1缓存策略
以下是一幅虽然信息包含量有限.但足够以最简洁的方式说明了“什么是HTTP1.1缓存策略”的图 缓存和缓存策略 web缓存(web cache)或代理缓存(proxy cache)是一种特殊的HTTP ...
- [工作积累] error: bad class file magic (cafebabe) or version (0033.0000)
Update Android SDK build tool to latest can solve my problem.
- 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014
Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/ 简译 translation: 作者在2012年写 ...
- 管理员必须掌握的八个cmd命令
一.ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的 ...
- Hello world,Hello 2015,Bye 2014
序 在我写下“在”这个字的时候已经是2014-12-31 19:59,14年最后一天了,总觉得不写点东西祭奠一下那些被自己虐死的脑细胞,心里就不舒服. 那就从生活,工作,学习三个方面,总结一下吧. 生 ...
- magic_quotes_runtime 与 magic_quotes_gpc
magic_quotes_runtime 与 magic_quotes_gpc 这两个函数都是管理是否对数据进行特殊符号转义,但是他们针对的处理对象不同: magic_quotes_gpc的设定值将会 ...