Linux内核分析第一周——计算机是如何工作的
冯诺依曼体系结构
核心思想
1.冯诺依曼是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。
2.采用二进制作为计算机数值计算的基础,以0、1代表数值。不采用人类常用的十进制计数方法,二进制使得计算机容易实现数值的计算。
3.程序或指令的顺序执行,即预先编好程序,然后交给计算机按照程序中预先定义好的顺序进行数值计算。
汇编语言的五种寻址模式
· 寄存器寻址 registermode: %寄存器 例如:%edx 访问寄存器edx
· 立即寻址 immediate: $数字 例如:$0x123 数值0x123
· 直接寻址 direct:数字 例如:0x123访问地址0x123指向的内存
· 间接寻址 indirect: (%寄存器) (%ebx) 例如:访问寄存器ebx中的地址指向的内存
· 变址寻址 displaced:偏移量(%寄存器) 4(%ebx):访问寄存器ebx中的地址再加4指向的内存;
几个重要的汇编指令
|
Example instruction |
What it does |
|
Pushl %eax |
Subl $4, %esp //栈顶指针减4,栈在向下生长一个位置 Movl %eax, (%esp) //将eax中的值放入栈顶指针指向的内存位置 |
|
Popl %eax |
Movl (%esp), %eax //从栈顶指针指向的内存中的值放入eax中 Addl $4, %esp //栈顶指针加4,栈在向上收缩 |
|
Call 0x12345 |
Pushl %eip //ip压栈 Movl $0x12345, %eip //将0x12345放入eip中 |
|
Ret |
Popl %eip //ip出栈 |
使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码。
源代码如下:
int g(int x)
{
return x + 9;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(18) + 11;
}
编译后的代码如下:
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $9, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $18, (%esp)
call f
addl $11, %eax
leave
ret
堆栈变化过程
1.main函数--pushl %ebp + movl %esp,%ebp
2.main函数--subl $4,%esp + movl $18,(%esp)
3.main函数--call f
4.f函数--pushl %ebp + movl %esp,%ebp
5.f函数--subl $4,%esp + movl 8(%ebp),%eax + movl %eax, (%esp)
6.f函数--call g
7.g函数--pushl %ebp + movl %esp, %ebp + movl 8(%ebp), %eax
8.g函数--addl $9,%eax + popl %ebp
9.g函数--ret 下一步将运行第15行的指令也就是f函数的leave指令
10.f函数--leave
11.f函数--ret 下一步将运行第23行的指令也就是main函数的addl指令
实验截图


黄伟业原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
Linux内核分析第一周——计算机是如何工作的的更多相关文章
- linux内核分析 第一周 计算机是如何工作的 20125221银雪纯
我使用的c语言代码是: int g(int x) { return x + 1; } int f(int x) { return g(x); } int main(void) { return f(6 ...
- LINUX内核分析第一周学习总结——计算机是如何工作的
LINUX内核分析第一周学习总结——计算机是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...
- Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程
Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...
- linux内核分析第一周学习笔记
linux内核分析第一周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第二周--操作系统是如何工作的
Linux内核分析第二周--操作系统是如何工作的 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- 《Linux内核分析》 之 计算机是如何工作的
[李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...
- Linux内核分析——第一周学习笔记20135308
第一周 计算机是如何工作的 第一节 存储程序计算机工作模型 1.冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构.程序指令存储地址和数据存储 ...
- Linux内核分析第一周学习总结:计算机是如何工作的?
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.冯诺依曼体系 ...
- Linux内核及分析 第一周 计算机是如何工作的?
C语言代码: int g(int x) { return x + 5; } int f(int x) { return g(x); } int main(void) { return f(5) + 1 ...
随机推荐
- SVG绘制图形
一.SVG介绍 1.SVG指可伸缩矢量图片 2.SVG用来定义用于网络的基于矢量的图形 3.SVG使用XML格式定义图形 4.SVG图像在放大或改变尺寸的情况下其图形质量不会有损失 5.SVG是万维网 ...
- 转 10 个 Nginx 的安全提示
Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它. 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你 ...
- Vue2.0中v-for迭代语法变化(key、index)【转】
转自:http://blog.csdn.net/sinat_35512245/article/details/53966788 Vue2.0的代码中发现 $key这个值并不能渲染成功,问题如下:但是v ...
- Netty入门(三)构成部分
该节主要讲解 Netty 的构成部分. 一.Channel 它代表一个用于连接到实体如硬件设备.文件.网络套接字或程序组件,能够执行一个或多个不同的 I/O 操作的开放连接.可以比作传入和传出数据的传 ...
- 关于ip判断
php正则实现ip段判断 $ip = '22.18.10.2'; $arrayip = array('123.12.*.*','22.18.10.*');//ip段 $ipregexp = implo ...
- Kubernetes1.91(K8s)安装部署过程(七)--coredns安装
为了是集群内的服务能使用dns进行服务解析,集群内需要使用dns服务器,可以按照kube官方dns,即kubedns或者其他的dns,比如coredns, 本例中按照的为coredns,按照简单,编辑 ...
- Python2.7-pprint
pprint 模块,提供了对数据的漂亮输出(pretty-print),它会尽量保持对象转变成字符串后只有一行,如果超过了指定的长度则会分成多行,目的就在于便于阅读和美观 模块的类: pprint.P ...
- HDU1232
https://vjudge.net/problem/HDU-1232 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都 ...
- 备份时如何排除掉默认的 information_schema 和 mysql 库?
备份时如何排除掉默认的 information_schema 和 mysql 库? mysql -e "show databases;" -uroot -ppassword | g ...
- C# 自定义类型转换
1.显式转换和隐式转换: ; long b=a; // 从int到long的隐式转换 int c=(int) b; // 从long到int是显式转换 ------------------------ ...