20189220 余超《Linux内核原理与分析》第二周作业
计算机如何工作的
一.存储程序计算机工作模型
冯诺依曼体系结构:核心思想为存储程序计算机。两个层面:
(1)硬件的角度(计算机主板):一个CPU,一块内存,之间有总线连接。CPU内部有一个IP计算器,IP指向内存中的指令,并依次加一执行;
(2)另一个层面,程序员的角度:存储程序计算机工作模型(如下图)
- 解释:CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU来解释和执行这些指令。
- API:应用程序编程接口(程序员与计算机的接口界面)。
- ABI:二进制接口,指令编码(程序员与CPU的接口界面)。
- 计算机内部采用二进制来表示指令和数据。
- 计算机的硬件应该由运算器、存储器、控制器、I/O设备所组成。
- 假定当前是32位X86机器,函数的返回值默认使用eax来返回给上级函数
- 主存在逻辑上可以看作字节数组
二.计算机的汇编指令:
(1)movl指令(32位):寄存器寻址,寄存器模式,以%开头的寄存器标示符。不和内存打交道,eax赋值给edx;
立即寻址,把立即数直接放在寄存器,立即数是以$开头的数值;
直接寻址,直接访问一个指定的内存地址的数据;
间接寻址:将寄存器的值作为一个内存地址来访问内存;
变址寻址:在间接寻址之时改变寄存器的数值。
(2)其他指令(32位):pushl 压栈,esp减4,把eax放入esp内存位置
popl 出栈,从堆栈栈顶取32位放到寄存器eax里面,有两个动作:首先间接寻址,把栈顶数值放到eax里面,再把栈顶加4。
call 函数调用,把当前的eip压栈,给eip赋新值;
注意:芯号是指这些指令是伪指令,程序员不能直接修改这些,即eip寄存器不能被直接修改,只能通过特殊指令间接修改。
三.汇编一个简单的C程序分析其汇编指令执行过程
简单的c语言程序:
输入gcc –S –o 20189220main.s 20189220main.c -m32 ,删除多余的代码从而形成汇编代码,如图:
- esp:寄存器存放当前线程的栈顶指针
- ebp:寄存器存放当前线程的栈底指针
- eip:寄存器存放下一个cup指令存放的内存地址,当cpu执行完成当前指令之后,从eip寄存器中读取下一条指令的内存,然后继续执行。
- eax:暂存一些数值,函数的返回值通过eax默认返回给上级函数(32位x86)。
四.阐述堆栈的变化过程:
当开始执行改程序的时候,eip是指向main函数入口地址,即eip指向18行存放的指令。设默认的堆栈栈低寄存器ebp的值为1000,则堆栈栈顶指针也为1000。
1、pushl %ebp: 把ebp的值压入堆栈,esp=996,栈顶值为1000
2、movl %esp,%ebp: 将esp的值传给ebp,则ebp值为996
3、subl $4,%esp:将esp的值减去4,则esp的值为992
4、movl $6,(%esp): 将esp所指的值为地址(寄存器间接寻址)的值 赋为6(堆栈的栈顶存放6)
此时堆栈:
5、call f:相当于pushl eip和movl f eip。堆栈先压入eip(23),esp=esp-4=988。然后把f函数的入口函数地址赋值给eip(存放第9行的指令代码)
此时堆栈:
6、pushl %ebp: 在堆栈中压入ebp的值,esp=esp-4=984
7、movl %esp,%ebp: 把esp的值赋给ebp。ebp=esp=984
8、subl $4,%esp: 把esp的值减去4。esp=esp-4=980
9、movl 8(%ebp),%eax: 把ebp+8的地址上所存的值赋给eax,即把地址为992,值为6赋值给eax寄存器
10、movl %eax,(%esp): 相当于压栈
此时堆栈:
11、call g: 相当于pushl eip和movl g eip。栈堆先压入eip(15),在把函数g的入口地址赋给eip
此时堆栈:
12、pushl %ebp: 堆栈压入ebp的值
13、movl %esp,%ebp: 把esp的值赋给ebp
14、movl 8(%ebp),%eax: 将ebp的值加8作为地址,其值赋给eax。即,eax值为6
15、addl $4,%eax: 将eax的值加4。eax的值为10
16、popl %ebp:堆栈弹出,其值赋给ebp。
此时堆栈:
17、ret : 相当于popl %eip(*)。堆栈弹出,其值赋给eip。则eip指向了存储15行代码的地址。
此时堆栈:
18、leave: 相当于movl %ebp,%esp和popl %ebp。将ebp的值赋给esp,堆栈弹出,其值赋给ebp。相当于销毁g的函数堆栈意思。esp=988,ebp=996。
此时堆栈:
19、ret : 相当于popl %eip(*)。堆栈弹出,其值eip(23)赋给eip
20、addl $2,%eax: 把eax的值加上2,eax的值为10+2=12。
21、leave :相当于movl %ebp,%esp和popl %ebp。将ebp的值赋给esp,堆栈弹出,其值赋给ebp。相当于销毁f的函数堆栈意思。esp=1000,ebp=1000
此时堆栈:
总结:
- 本周通过学习计算机汇编的基础知识和基本原理,理解到了计算机的基本原理存储程序和程序控制。
- 预先要把指挥计算机如何进行操作的指令序列(称为程序)和原始数据通过输入设备输送到计算机内存贮器中。每一条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地址去等步骤。
- 计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。
- 这只是一个简单的程序,在后面的学习中要把老师介绍的深入理解计算机系统的第三章程序的机器级表示的内容再看一看,学会用计算机的思维来进行思考和编程。
转载于:https://www.cnblogs.com/yuchao123/p/9819641.html
20189220 余超《Linux内核原理与分析》第二周作业相关推荐
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果?下落的速度正好 那么13年的长度刚好是地球的最远距离!直径两端 在进行实验楼操作之前,先听授了网易云课堂中孟老师关于"计算机是如何工作的?"的介绍 ...
- 2022-2023-1 20222809《Linux内核原理与分析》第一周作业
Linux内核原理与分析第一周作业 配置环境 1.参考Linux(Ubuntu)系统安装图文教程中第二种借助virtualbox成功配置Ubuntu环境 2.升级更新软件包 可以通过调节分辨率和虚拟机 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2018-2019-1 20189213《Linux内核原理与分析》第四周作业
<Linux内核原理与分析>第四周学习总结: 1.课本知识总结: 本章内容并不多,首先是介绍了一些Linux内核源代码的目录结构,并基于Linux内核源代码构造一个简单的操作系统MenuO ...
- 算法原理与分析第二次作业
算法原理与分析第二次作业 #include<stdio.h> #include<string.h> #define MAX 100 int n=0,i=0; char *key ...
- 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 20169210《Linux内核原理与分析》课程总结
每周作业链接汇总 第一周作业:对实验楼<Linux 基础入门(新版)>课程的学习,其中有用户及文件权限管理.Linux 目录结构及文件基本操作.环境变量与文件查找.文件打包与解压缩等共17 ...
- 20189220 余超《Linux内核原理与分析》第八周作业
Linux内核如何装载和启动一个可执行程序 本章知识点 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files) ...
- 20189220 余超《Linux内核原理与分析》第四周作业
构造一个简单的Linux系统MenuOS 第三章基础知识 计算机的三大法宝:存储计算机,函数调用堆栈,中断. 操作系统的两把宝剑:中断上下文,进程上下文. Linux内核源码的目录结构: arch目录 ...
- 20189220 余超《Linux内核原理与分析》第七周作业
分析Linux内核创建一个新进程的过程 基础知识概括 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚拟内存和文件.其中,操作系统最核心的功能 ...
最新文章
- 公司电脑安装操作系统遇到的一个坑
- 2012年春节网购火车票方法及注意事项
- python学习:time、unixtime、string的转换
- 简单的用户登录(一)
- 《计算机应用基础》18春作业,【北语网院】18春《计算机应用基础》作业_4.pdf...
- 学校学生工科学生接私活_为什么我要在学校教年轻的学生如何编码
- Python3中queue模块的使用
- 理财产品利息可每天提取吗?
- ArcGIS制图技巧系列(2)地形渲染
- java性能优化权威指南_《Java性能优化权威指南》PDF 下载
- 手机扫描识别车牌,车牌识别
- ubuntu 安裝deb_ubuntu安装deb
- scratch——贪吃蛇(变量、克隆、可连手柄)
- 财源滚滚的第三方支付牌照
- 设置了普通密码的excel打不开怎么办
- 北京消费扶贫双创中心启用 2000余种特色产品长期展销
- JQuery实现图片自动轮播左右切换鼠标移入
- 百度地图api实现轨迹运动效果
- 老师助手为什么总是服务器错误,【家长助手】孩子在校总犯错 解决内因最关键...
- 对抗中的主动防御 —— HW及小规模网络对抗的战术