一、计算机系统概论
chaper1指令集体系结构(ISA)
1、计算机系统=软件➕硬件
上层是下层的抽象,下层是上层的实现。底层为上层提供支撑环境。
2、计算机硬件和软件的接口:指令系统
3、软硬件界面:指令集体系结构(ISA)有时简称系统结构、体系结构,指令结构,甚至简称"架构"。
4、机器语言由指令代码构成,能被硬件直接执行。
5、ISA是一种规约,规定了如何使用硬件:
6、现代计算机系统层次:应用程序、语言处理系统、操作系统、指令集体系结构、计算机硬件
chapter2冯诺依曼结构主要思想
1、1945年,在共同讨论的基础上,冯诺依曼以"关于EDVAC的报告草案"为题,起草了长达101页的总结报告,发表了全新的"存储程序通用电子计算机方案"。
1946年第一台通用的电子计算机ENIAC诞生。
主要的逻辑元件(用来处理电信号的最小逻辑单元)为电子管。
设计"存储程序"计算机,被称为IAS计算机,为1951年完成,此计算机并不是第一台存储程序计算机,第一台是1949年由英国剑桥大学完成的EDSAC。
2、发展阶段:
- 第一代:电子管
- 第二代:晶体管
- 第三代:中小规模集成电路
- 第四代:大规模、超大规模集成电路
3、摩尔定律
揭示了信息技术进步的速度。
集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,整体性能也将提升一倍。
4、冯诺依曼结构
(1)工作方式
采用"存储程序"的工作方式。此工作方式的基本思想是:必须事先编好程序,并将程序和原始数据送入存储器后才能执行程序;一旦程序被启动执行,计算机能在不需操作人员干预的情况下自动从存储器中逐条取出指令并执行指令。(关键词:存储,程序)
(2)构成
我们可以自然而然推断出以下:
- 应该有一个主存,用来存放程序和数据
- 应该有一个自动逐条取出指令的部件
- 应该有具体执行指令(即运算)的部件
- 程序由指令构成
- 指令描述如何对数据进行处理
- 应该有将程序和原始数据输入计算机的部件
- 应该有将运算结果输出计算机的部件
抽象出来即为
早期,部件之间用分散方式相连;现在,大多用总线方式相连。
(3)主要思想
<1>计算机应由运算器、控制器、存储器、输出设备、输入设备五个基本部件组成。
<2>各基本部件的功能:
- 存储器不仅能存放数据,还能存放指令。两者虽在形式上没有任何区别(都是0/1序列),但计算机应能区分数据还是指令。
- 控制器应能自动取出指令来执行(一个能够自动读取指令并对指令进行译码的部件)。
- 运算器应能进行四种基本算术运算,并且也能进行一些逻辑运算和附加运算。(为了向ALU提供操作数,以及临时存放从主存取来的数据或运算的结果,还需要若干通用寄存器,组成通用寄存器组。CPU需要从通用寄存器中取数据到ALU运算,或把ALU运算的结果保存到通用寄存器中,因此需要给每个通用寄存器编号)。
- 操作人员通过I/O设备和主机进行通信。
<3>内部以二进制表示指令和数据。每条指令由操作码(指出操作类型)和地址码(指出操作数的地址)两部分组成。由一串指令组成程序。
<4>采用"存储程序"工作方式。
chapter3现代计算机结构模型及工作原理
1、中央处理器最基本最核心的路径:
- CPU:中央处理器
- PC:程序计数器
- MAR:存储器地址寄存器
- ALU:算术逻辑部件
- IR:指令寄存器
- MDR:存储器数据寄存器
- GPRs:通用寄存器组
现代计算机结构模型也逃不出冯诺依曼结构的框架。
所以也有存储器,存储器被划分成一个一个存储单元,并编上号。也有控制器。
也有ALU(算术逻辑部件),送进去的操作数可以是寄存器的操作数,也可以是存储器的操作数,运算的结果可以继续放到某个寄存器中,也可以通过总线输出到存储器。
寄存器的数据可以通过MDR送到存储器。存储器的数据也可以通过MDR送到寄存器。
标志信息(例如:结果是否为0(零标志ZF)、是否为负数(符号标志SF)等)存储在标志寄存器里面,然后送到控制器中影响后续指令的执行。
如果要执行一条指令,那么要把指令的地址事先送到专门的寄存器里面(PC:程序计数器),指令的地址要先送到MAR(主存的地址寄存器),然后通过总线送到存储器。操作数的地址也要送到MAR。
GPRs通用寄存器组,由若干个通用寄存器组成。
指令从MDR取过来,再送到控制器中执行。先要放到指令寄存器(IR)中。
大概的过程:cpu要从存储器中取指令,必须先把地址送给存储器,并把控制信号送到控制线上,告诉存储器要读某地方的信息,读出来的信息通过数据线送到MDR,指令送到指令寄存器,数据送到寄存器,再送到ALU进行运算。
2、计算机是如何工作的?
类似"存储程序"的工作方式
3、指令中需要给出的信息:
- 操作性质(操作码)
- 源操作数1 和/或 源操作数2 (立即数、寄存器编号、存储地址)双目运算就有两个操作数
- 目的操作数地址(寄存器编号、存储地址)寄存器中/存储器中
存储地址的描述与操作数的数据结构有关!
chapter4从机器语言到高级编程语言
1、最早的程序开发用机器语言编写程序(0/1序列),并记录在纸带或卡片上。
缺点:若在中间指令前加入指令,则需重新计算地址码,重新打孔。不灵活,书写阅读困难!
2、用汇编语言开发程序。用符号表示跳转位置和变量位置。
用助记符表示操作码。标号表示位置。助记符表示寄存器。
优点:
- 不会因为增减指令而需要修改其他指令
- 不需记忆指令编码,编写方便
- 可读性比机器语言强
缺点:人认识了,机器不认识了。
需将汇编语言转换为机器语言。用汇编程序转换。
e.g:有一条机器指令"1110 0110",其中操作码1110表示取数(load)操作,0110表示主存地址6。取数指令的功能是将指定主存地址中的数据取到0号寄存器,那么,机器指令"1110 0110"对应的汇编指令可以写为"load r0,6#",指令load是操作码助记符,r0表示0号寄存器,6#表示主存地址6。
CPU中所有微操作都由时钟信号进行定时,时钟信号的宽度为一个时钟周期。一条指令的执行时间包含一个或多个时钟周期。
3、进一步认识机器级语言。
- 汇编语言(源)程序由汇编指令构成
- 什么是汇编指令?用助记符和标号表示的指令(与机器指令一一对应)
- 指令又是什么?包含操作码和操作数或其地址码(机器指令用二进制表示,汇编指令用符号表示);只能描述取/存,两个数加(减乘除与或),根据运算结果判断是否转移执行
- 如果用汇编语言描述复杂程序,程序会很长且在不同机器上可能不能运行。
机器语言和汇编语言都是面向机器结构的语言,统称为机器级语言。
总结:汇编语言比机器语言好,但还是麻烦!
4、用高级语言开发程序。
- 与具体机器结构无关
- 面向算法描述,比机器级语言描述能力强得多
- 高级语言中一条语句对应几条几十条甚至几百条指令
- 有"面向过程"和"面向对象"的语言之分
- 处理逻辑有三种结构:顺序、循环、选择
- 最终还是要把高级语言转换为机器语言。有两种方式:"编译"和"解释" (编译程序:将高级语言源程序转换为机器级目标程序,执行时只要启动目标程序即可。) (解释程序:将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件。)
翻译程序:汇编、编译、解释
5、为什么要转换的🌰
二、二进制编码
chapter1基本概念
1、机器级数据分为两大类:
- 数值数据:无符号整数、带符号整数、浮点数(实数)等
- 非数值数据:逻辑数、西文字符和汉字等
2、真值和机器数:
- 机器数:用0和1编码的计算机内部的0/1序列(计算机内部编码表示后的数)(补码)
- 真值:机器数真正的值,即:现实中带正负号的数
chapter2进制转换
用一个下标表示数的基(或用后缀B--二进制、H--十六进制、O--八进制)十六进制还可以用前缀0x表示
1、二八十六进制数的相互转换
2、R进制数=>十进制数(按"权"展开)
3、十进制数=>R进制数(整数小数分别转换)
chapter3数值数据的编码表示
1、表示一个数值型数据要确定三个元素:
- 进位计数制
- 定点/浮点表示
- 编码规则
2、
(1)解决小数点问题
定点数:小数点位置约定在固定位置的数
浮点数:小数点位置约定为可浮动的数
任意一个浮点数都可以用一个定点小数和一个定点整数来表示
定点整数的表示分为:
- 无符号整数
- 带符号整数
(2)解决正负号问题
4种定点数编码表示方式:
- 原码
- 补码
- 反码
- 移码
3、原码的表示
4、补码表示法
(1)补码的特性 > 模运算(+和-的统一)
结论1:一个负数的补码等于模减该负数的绝对值
结论2:对于某一确定的模,某数-小于模的另一数,总可以用该数+另一数负数的补码来代替
结合起来
结论3:一个负数的补码等于对应正数补码的"各位取反,末位加一"
当相加的和超出了n位数可表示的范围,则称发生了溢出现象
结论4:同一个真值在机器中可能有不同的机器数
(2)补码的表示
正数:符号位为0,数值部分不变
负数:符号位为1,数值部分"各位取反,末位加1"
末位不加1是反码
变形(模4)补码:双符号,用于存放可溢出的中间结果
(3)如何求补码的真值
真值范围:-2^(N-1) to 2^(N-1)-1
符号为0,则为正数,数值部分相同
符号为1,则为负数,数值各位取反,末位加1
5、移码表示(主要用来表示浮点数的阶码)
(1) 移码表示是将每一个数值加上一个偏置常数
当编码位数为n时,偏置常数取2^(n-1)
移码和补码仅第一位不同
(2)为什么要用移码来表示指数(阶码)?
便于浮点数加减运算时候的对阶操作(比大小)
5、无/带符号整数的表示
(1)无符号数机器中字的位排列顺序有两种方式:
- 高到低位从左到右 LSB表示最低有效位
- 高到低位从右到左 MSB表示最高有效位
高到低位多采用第一种
(2)为什么能表示的最大值>位数相同的带符号整数的最大值?
举个🌰:8位无符号整数最大是255(1111 1111)
而8位带符号整数最大为127(0111 1111)
(3)如果指定位数,但此数不够位数时:
带符号整数:符号扩展
无符号数: 0扩展
6、科学计数法与浮点数
7、浮点数的表示范围
(1)32位单精度格式:符号1位 阶码8位 尾数23位
64位双精度格式:符号1位 阶码11位 尾数52位
(2)浮点数的表示(IEEE754 浮点数标准)
小数点前总是1,故可隐含表示
SP规格化数阶码范围:0000 0001(-127) to 1111 1110(127) 全1全0表示特殊值
bias为127(single),1023(double)
转换公式:
尾数:规格化尾数最高位总是1,隐含表示,省1位
1+23bits(single) 1+52bits(double)
转换问题🌰:
转换成十进制:
- 记录符号位 1负数 0正数
- 将阶码(二进制)转换为十进制再减去127(偏移量)
- 尾数中按二进制中小数点后面的权进行相加并加上1
转换成二进制
- 记录符号位 同上
- 将十进制转换为二进制再进行规格化 前面的部分代表位数 注意要把第一个1不要 只需要小数点后的部分
- 阶码用指数加上127(偏移量)
(3)浮点数除0问题
在浮点运算中,一个有限数除以0,结果位正无穷大(负无穷大)
e.g:5.0/0=+无穷 -5.0/0=-无穷
(4)Not a Number 非数(NaN)
表示一个没有定义的数
e.g:sqrt(-4.0) = NaN
0/0 = NaN等
8、用BCD码表示十进制数
每个十进制数位至少有4位二进制表示。而4位二进制位可以组合成16种状态,去掉10种还有6种冗余的。
总结:
浮点数的精度:与尾数的位数和是否规格化有关
浮点数的范围:与阶码的位数和基的大小有关
9、逻辑数据的编码表示
- 用一位表示
- 按位与 按位或 逻辑左右移
- 0/1序列 机器靠指令识别
- n个二进制数(位串)用来表示若干个状态位或控制位
10、数据的基本宽度
比特(bit)是计算机中处理、存储、传输信息的最小单位
二进制信息的计量单位是字节(byte),也称"位组"
现代计算机中,存储器按字节编址
字长指定点运算数据通路的宽度(字长等于cpu内部定点运算部件的位数、通用寄存器的宽度等)
而字表示被处理信息的范围,用来度量数据类型的宽度
e.g:在IA-32中字有16位,字长有32位
11、数据的存储和排列顺序
大端方式:MSB所在的地址是数的地址,从数据的最高有效字节开始存放
小端方式:LSB所在的地址是数的地址,从数据的最低有效字节开始存放