Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
首先,我们先写一个简单的C语言程序,如下:
int g(int x)
{
return x +3;
} int f(int x)
{
return g(x);
} int main(void)
{
return f(8) + 1;
}
然后我们把源程序编译成一个汇编语言,指令如下
gcc -S -o main.s main.c -m32 得到结果,删去符号项得到结果

首先,main函数为该程序的开始入口,所以从main函数开始分析:
- 在line 17 ~ line 18是进入main函数(enter操作),其过程是:
首先是pushl %ebp操作:sp-4,然后将当前bp的值放入sp所指向的内存区块,然后是movl %esp, %ebp:将esp的值赋值给ebp,这样bp和sp将指向同一个位置,就是重新指向了sp所指向的栈顶位置.- line 19操作将立即数8入栈,做好准备,以便于进行加法操作时使用.
在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的值(即8的值)放入sp所指向的被分配的内存区块,为函数g的调用做准备.
在line 12是开始调用g函数,这里开始对g函数进行分析:
- line 2 ~ line 3 执行enter操作,同f函数.
- line 4 将bp+8的所指向的值放入ax中,即8,为下面的加法操作做准备.
- line 5 将立即数3在ax中的值做加法操作,然后结果放入ax中.
- line 6 弹出栈顶的ip,sp+4
- line 7 返回g函数,执行完后,弹出栈顶的内容放入ip中,此时堆栈回到了调用函数g之前的状态,得到g(8)
回到f函数中:
- line 13 ~ 15 执行后,堆栈恢复到函数f调用之,得到f(8)
最后,回到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内核分析第一周-通过分析汇编代码理解计算机是如何工作的的更多相关文章
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
秦鼎涛 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http: ...
- 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理
Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...
- Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理
Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
- Linux内核设计第一周学习总结 计算机如何工作
北京电子科技学院 20135310陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002 ...
- Linux内核分析——第一周学习笔记20135308
第一周 计算机是如何工作的 第一节 存储程序计算机工作模型 1.冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构.程序指令存储地址和数据存储 ...
- Linux内核分析——第一周学习笔记
20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 第一节 存储程序计算机工作模型 1.冯诺依曼体系结构:即具有存储程序的计算机体系结构.目前大多数拥有计算和存储功能的设备(智能 ...
随机推荐
- php之常量
前面的话 常量在javascript中并不存在,在php中却是与变量并列的重要内容.常量类似变量,但常量一旦被定义就无法更改或撤销定义.常量最主要的作用是可以避免重复定义,篡改变量值,提高代码可维护性 ...
- JS 添加js节点
function AddScriptNode(src) { var N = document.createElement("script"); N.setAttribute(&qu ...
- iOS 根据经纬度计算与地理北极夹角
http://www.aiuxian.com/article/p-2767848.html #define toDeg(X) (X*180.0/M_PI) /** * @method 根据两点经纬度 ...
- WCF(四) 绑定
绑定 是一个制定好的通道栈,包含了协议通道,传输通道和编码器.从功能上来看,一个绑定集成了通信模式.可靠性.安全性.事务传播和互操作性 绑定方式分两种:代码中和配置文件中绑定 1: 2: 3.配置ap ...
- PHP中文字数限制:中文字符串截取(mb_substr)
一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...
- 阿里云ecs禁止ping,禁止telnet
现在的中小型企业服务器大多是云比较多,因此,可能会面临着服务器ping不通,或者是端口telnet不通的情况,但是服务器上的服务仍然是正常的情况,这个时候我们就要考虑是不是云上配置了访问规则了.废话不 ...
- codeforces#505--C Plasticine Zebra
C. Plasticine zebra time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Java编程思想第四版勘误
坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...
- 在CentOS7下从0开始搭建docker并发布tomcat项目
一切从0开始,我也是个小白: 1.检查你的系统是不是高于3.8的内核,如果没有请升级CentOS7或者Ubuntu 14 #uname -a 2.CentOS7下安装docker #yum -y in ...
- | unauthenticated user (1130, "Host '127.0.0.1' is not allowed to connect to this MySQL server")
mysql> show processlist;+----+----------------------+-----------------+------+---------+------+-- ...