计算机如何工作的

一.存储程序计算机工作模型

冯诺依曼体系结构:核心思想为存储程序计算机。两个层面:
(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
此时堆栈:

总结:

  • 本周通过学习计算机汇编的基础知识和基本原理,理解到了计算机的基本原理存储程序和程序控制。
  • 预先要把指挥计算机如何进行操作的指令序列(称为程序)和原始数据通过输入设备输送到计算机内存贮器中。每一条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地址去等步骤。
  • 计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。
  • 这只是一个简单的程序,在后面的学习中要把老师介绍的深入理解计算机系统的第三章程序的机器级表示的内容再看一看,学会用计算机的思维来进行思考和编程。

20189220 余超《Linux内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  10. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

随机推荐

  1. Django 信号使用问题

    Django 信号使用问题: 在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发.百度&官方文档找到了答案 1.信号的函数应该放在哪里? 这段代码应该放在哪里? 严格 ...

  2. vim插件(vim-emmet)安装步骤

    vim安装插件  vim-emmetvim-emmet网址  https://www.vim.org/scripts/script.php?script_id=2981pathogen.vim网址  ...

  3. Flink入门 - CoGroup和Join

    /* *CoGroup */ final StreamExecutionEnvironment streamExecutionEnvironment = StreamExecutionEnvironm ...

  4. Telnet入侵WindowsXP

    上一章,采用图形界面配置.这一节,采用命令方式配置 //修复.bat(掩饰名字) @ echo off //关闭回显 regedit.exe /s start.reg ///s 不打印 net sta ...

  5. python+java全栈工程师 转 向前端的路

    python的优点 简单 简单 简单 我目前在公司用python 1. 增加odoo的各种业务,成本核算.自动跑单.自动备份数据库之类的 ----odoo是国外大佬做的一个开源erp 用的python ...

  6. .gitignore详解(附上eclipse的java项目的 .gitignore文件)

    今天讲讲Git中非常重要的一个文件――.gitignore. 首先要强调一点,这个文件的完整文件名就是“.gitignore”,注意最前面有个“.”.这样没有扩展名的文件在Windows下不太好创建, ...

  7. python爬虫系列:三、URLError异常处理

    1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常. ...

  8. Yii2模型介绍

    通过来说,我们可以把yii2中的Mdoel分为两种: 1)数据模型: 2)表单模型: 数据模型 数据模型关联数据表,用来实现对数据的操作; 一般数据模型放在common/models下: 表单模型 表 ...

  9. 【快捷键】印象笔记Markdown快捷键

    新建 Markdown 笔记 CMD+D 粗体 CMD+B 斜体 CMD+I 删除线 CMD+S 分隔线 CMD+L 编号列表 CMD+Shift+O 项目符号列表 CMD+Shift+U 插入待办事 ...

  10. 【Docker】docker安装redis

    一.下载镜像并运行容器 1.指定redis.conf配置文件方式运行 docker run -p 6379:6379 --name myredis -v $PWD/conf/redis.conf:/e ...