[TOC]
第1章 计算机系统概述
-
计算机发展历程
-
计算机系统的基本组成
-
计算机系统的层次结构
-
计算机系统性能评价
计算机的发展历程
第一代计算机:真空管计算机 十进制运算1946 ENIAC
第二代计算机:晶体管计算机 内存由磁芯构成 外存为磁鼓与磁带
第三代计算机:中小规模集成电路计算机
IBM 360:兼容机(相同或相似的指令集与操作系统)
好处:原来机器上的程序可以不改动而在新机器上运行,但性能不同
关键:“向后兼容”,低端机指令集是高端机的一个子集
DEC PDP-8:总线结构
好处:可扩充性好,节省器件,体积小,价格便宜
第四代计算机:大规模集成电路计算机
特点:共享存储器,分布式存储器及大规模并行处理系统
半导体存储器,微处理器
冯·诺依曼结构:
1945年冯·诺依曼提出“存储程序”思想:将事先编号的程序和原始数据送入主存中;启动执行后,不需要干预即可自动逐条取出指令和执行指令。1946年开始设计“存储程序”计算机。
主要思想:①计算机组成:运算器、控制器、存储器、输入设备、输出设备
- 运算器:加减乘除基本算术运算、逻辑运算和附加运算
- 控制器:自动执行指令
- 存储器:存放数据、存放指令
内部以二进制表示指令和数据:指令(操作码指出操作类型,地址码指出操作地址),一串指令组成程序
“存储程序”的工作方式
IAS计算机是现代计算机的原型机(IAS 1946年设计的计算机)
计算机系统的组成
- 计算机硬件:CPU+ MM +I/O
- 计算机软件:系统软件+应用软件
计算机:能对数字化信息进行自动、告诉的算术和逻辑运算的处理装置
基本部件和功能
- 运算器(数据运算):ALU、GPRs、标志寄存器等
- 存储器(数据存储):存储阵列、地址译码器、读写控制电路
- 总线(数据传送):数据线(MDR)、地址线(MAR)和控制线
- 控制器(控制):对指令译码生成控制信号
冯诺依曼结构计算机模型:
认识计算机中最基本的部件:
CPU:中央处理器 PC:程序计数器 MAR:存储器地址寄存器
ALU:算术逻辑部件 IR:指令寄存器 MDR:存储器数据寄存器
GPRs:通用寄存器组(若干通用寄存器组成,早期就是累加器)
“存储程序”工作方式
程序由指令组成:
- 数据和指令事先存放在存储器,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址送入PC
- 开始执行程序:
-
- ① 分局PC取指令送IR:PC->MAR,存储器->MDR->IR
- ② 指令译码:IR->控制器,在控制器中译码
- ③ 取操作数:从GPRs或存储器->ALU
- ④ 执行指令指定的具体操作:ALU中完成
- ⑤ 回写结果到GPRs或存储器
- ⑥ 修改PC的值,使其指向下一条指令
- ① 分局PC取指令送IR:PC->MAR,存储器->MDR->IR
程序启动前,指令和数据都存放在存储器中,都是0/序列;指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU的寄存器中:指令在IR中,数据在GPR中
指令的信息:
- 操作码——指示该指令要完成什么操作,eg加减法
- 一个或多个源操作数(立即数、寄存器编号、存储地址)
- 目的操作数地址(寄存器编号、存储地址)
存储地址的描述与操作数的数据结构有关
软件
- 系统软件
-
- 操作系统:硬件资源管理,用户接口
- 语言处理系统 主要有编译器和汇编器 建立在操作系统之上
-
- 编译器和汇编器生成的目标程序由机器级代码组成
- 操作系统通过指令直接对硬件进行编程控制
- 翻译程序有三类:汇编程序、编译程序、解释程序
- 编译器和汇编器生成的目标程序由机器级代码组成
- 其他实用程序
- 操作系统:硬件资源管理,用户接口
- 应用软件
软件和硬件的界面:ISA
ISA处于硬件与软件的交界面,ISA是对硬件的抽象,所有软件功能建立在ISA之上
计算机系统的层次结构
任何高级语言程序最终通过执行若干条指令来完成
程序执行结果取决于①算法程序编写 ②语言处理系统、操作系统、ISA、为体系结构
计算机系统抽象层的功能转换:上层是下层的抽象,下层是上层的实现(底层为上层提供支撑环境)
ISA指令集体系结构:规定如何使用硬件
- 可执行的指令集合
- 指令接受的操作数类型
- 操作数所能存放的寄存器组结构
- 操作数所能存放的存储空间大小和编址方式
- 操作数大端/小端方式存放
- 指令对操作数的寻址方式
- 指令执行过程的控制方式
ISA是计算机系统中必不可少的一个抽象层,ISA是计算机组成的抽象
同一种ISA可以有不同的计算机组成,不同ISA规定的指令集不同,计算机组成要能够实现ISA规定的功能
ISA和计算机组成(微结构)间的关系:
计算机系统的性能评价
衡量计算机性能的基本指标
响应时间(执行时间、等待时间):作业提交到作业完成的时间
吞吐率:单位时间完成的工作量 某些场合也叫带宽
计算机性能测量:执行时间
系统性能和CPU性能不等价,有一定区别,本章主要讨论CPU性能,即CPU执行时间——执行一个程序中全部指令所花的时间,它是计算机的基本性能评价指标
CPU执行时间的计算有关时钟周期、时钟频率和CPI
-
时钟频率:CPU主频
-
CPI:每条指令执行的时钟周期数 CPI=CPU时钟周期数÷指令条数 CPI一般用来衡量ISA的综合性能
-
CPU执行时间计算
-
-
CPU时钟周期数 × 时钟周期
- CPU时钟周期数 ÷ 时钟频率
- CPI × 指令条数 × 时钟周期
-
- CPI的计算:CPI = (CPU时间×时钟频率)/指令条数 = 总时钟周期数/指令条数
频率的提高和速度的提高并不是成比例的
-
-
CPU时间:CPU真正花在执行该程序的时间
-
-
用户CPU时间
- 系统CPU时间
其他时间:等待I/O操作完成或CPU花在其他用户程序的时间
-
指令执行速度指标MIPS和MFLOPS
MIPS:每秒执行多少百万条指令(定点数指令)——MIPS总是一个平均值(不能反应性能的好坏)
MIPS = 时钟频率/CPI × 1/106
MFLOPS:每秒能执行多少百万次(10^6^)浮点数运算,反应机器对浮点数处理的速度
性能评价程序——基准程序Benchmarks
公用的基准测试程序:SPEC
基准程序中最好包含编译器,避免编译器产生的特殊作用
Amdahl阿姆达尔定律
基本思想:对系统中某部分(软件或硬件)更新带来的系统性能改进成都,取决于该部分被使用的频率或其执行时间占总执行时间的比例。
或
可以表示为
第二章 数据的机器级表示
- 数值数据的表示
- 非数值数据的表示
- 数据的宽度
- 数据的存储和【排列顺序
- 数据的检错与纠错
数值数据的表示
定点数的表示
进位计数制
定点数的二进制编码
定点整数的表示——无符号整数、带符号整数
浮点数的表示
浮点数格式和表示范围
浮点数的规格化
IEEE754浮点数标准——单精度浮点数 双精度浮点数 特殊数的表示形式
十进制数的表示
ASCII码表示
BCD码表示
信息的二进制编码
机器级数据——数值数据(无符号整数、带符号整数、浮点数、十进制数)、非数值数据(逻辑数、西文字符和汉字)
机器数和真值
数值数据的表示方法
-
数值数据表示的三要素——进位计数制、定点/浮点、编码方式(源码、补码、反码、移码)
-
移码表示——每个数值加一个偏置常数
-
- 标准移码——编码位数n,bias = 2^n-1^——E~移~ = E + 2^3^
- 主要用来表示浮点数的阶码——原因:便于浮点数加减运算时的对接操作(比较大小)
- 标准移码——编码位数n,bias = 2^n-1^——E~移~ = E + 2^3^
-
无符号整数
LSB:高到低位从左到右(Least 常用) MSB:高到低位从右到左(Most)
-
带符号数,定点整数
MSB表示数的符号
- 多种定点编码方式:
-
- 原码(常用来表示浮点数的尾数)
- 反码(不用于数值数据)
- 补码(表示带符号数、定点整数)
- 移码(表示浮点数的指数)
- 原码(常用来表示浮点数的尾数)
带符号数与无符号数的比较
- 扩充操作差异:无符号数0扩展(高的空位补0) 带符号整数符号扩展(空的高位补符号位)
- 比较差异:无符号数MSB为1的数比MSB为0的数大 带符号数……小(移码除外)
- 溢出判断有差异:最高位无溢出时,不产生“溢出异常”错误
-
科学计数法与浮点数
- 规格化形式:小数点前只有一位非0数
- 对于二进制数:0.101 × 2^-10^ 其中:0.101是尾数 2是基数 -10是阶码
- 基数采用默认值无需表示,对尾数和指数分别编码,就可以表示一个浮点数
IEEE754浮点数格式
S:0正1负
规格化数:+/-1.xx…x ×2^E^
阶码/指数E——移码表示(非标准移码)
-
偏移值为:2^7^-1 = 127(单精度) 2^10^-1 = 1023(双精度)
-
阶码取值范围:-127~128,移码为0000 0000 ~ 1111 1111
-
规格化数的阶码取值范围:阶码全为0和全为1用来表示特殊值,
则阶码取值:0000 0001(-126)~ 1111 1110(127)
(不用128为偏移码是因为-126~127能表示的最大浮点数变小了)
尾数:
- 规格化尾数最高位总是1,被隐含表示,省了1位
- 实际尾数位数:1+23 = 24bits(单精度) 1+52=53bits(双精度)
单精度:(-1)^S^×(1+M)× 2^(E-127)^
双精度:(-1)^S^ ×(1+M)× 2^(E-1023)^
特殊数据表示(阶码或尾数为全0或全1)
指数 | 尾数 | 含义 |
---|---|---|
1~254 | 任意(隐含整数1) | 一般数据 |
0 | 0 | |
0 | 非零 | |
255(全1) | 0 | |
255(全1) | 非零 |
0的表示
指数全0,尾数全0,符号位可取0和1
±的表示
浮点数运算中,除数为0的结果是±(整数除0会发生溢出异常)
可以利用±作比较,也有一些运算需要
表示:指数全1,尾数全0
非零NAN的表示
指数全1,位数非0,常用于程序调试过程
非规格化数
大于0小于2^-126^的部分
单精度非规格数的阶码为全0时,真值为-126,而非-127
尾数表示中没有隐含的“1”,隐含的整数是“0”,即为一个纯小数
十进制数的表示
①ASCII码表示 ②BCD码表示
ASCII码表示十进制数
前分隔数字串:正负号用数字串前的一个字节表示,+ ——2BH,- ——2DH
后嵌入数字串:符号嵌入最低位数字的ASCII码高四位中,比“前分隔”节省一个字节
嵌入方式:正数不变,负数高四位变为0111
ASCII码缺点:占空间大,需要转换成二进制数或BCD码才能计算
BCD码(8421码)表示十进制数
编码思想:每位十进制数用4位二进制数表示
编码方案:0000~1001表示0~9
符号表示:“+”——1100,“-”——1101
非数值数据表示
逻辑数据的编码表示
表示:N位二进制数表示N个逻辑数据
运算:按位进行 eg.按位与,按位或,逻辑左移,逻辑右移
识别:指令识别
位串:表示若干个状态位或控制位
西文字符的编码表示
特点:对有限个字母、数学符号和标点符号等字符编码
表示(常用编码为7位ASCII码):
- 十进制数10个
- 英文字符52个
- 专用符号33个
- 控制符号33个
操作:字符串操作,如传送、比较等
汉字及国际字符的编码表示
编码形式:
- 输入码:如键盘输入
- 内码:系统中存储、查找、传送,至少两个字节才能表示一个汉字内码
- 字模点阵或轮廓描述:描述图像和图形,用于显示/打印。直线向量轮廓、曲线轮廓。所有汉字字形预先存在机内,不同字体对应不同字库
数据的宽度
比特、字节(位组)、字
现代计算机中,存储器按字节编址,LSB表示最低有效字节,MSB表示最高有效字节
字:被处理信息的单位,用来度量数据类型的宽度(字和字长的宽度可以相等,可以不等)
字长:定点运算时数据通路的宽度 字长 = CPU内部总线的宽度,或运算器的位数,或通用寄存器的宽度
数据通路:CPU内部进行数据运算、存储和传送的路径以及路径上的部件
数据量的度量单位
b比特 B字节 MBps 兆字节/秒
程序中数据类型的宽度
不同机器上表示的同一种类型的数据可能宽度不同
各种类型数据分配的字节数随机器字长和编译器的不同而不同
数据的存储和排列顺序——大小端和边界对齐
字的存放问题和字的边界对齐问题
存放方式:
-
小端方式:LSB所在的地址是数的地址——低字节放低地址
-
大端方式:MSB所在的地址是数的地址——高字节放低地址
例题:
字节交换问题——不同系统间通信可能会发生问题
对齐:要求数据存放的地址必须是相应的边界地址+
不同长度的数据存放时,有两种处理方式:
-
按边界对齐(假定存储字的宽度为32位,按字节编址)->每四个字节可同时读写
- 字地址:4的倍数(低两位为0)
- 半字地址:2的倍数(低位为0)
- 字节地址:任意
-
不按边界对齐
可能会增加访存次数(某种程度上会节省空间)
举个栗子:
数据的检错与纠错
解决问题措施:
- 计算机硬件的可靠性:eg.电路、电源、布线等各方面采取必要的措施,提高计算机的抗干扰能力
- 采取数据检错和校正措施,自动发现并纠错
如何进行错误检测与校正:“冗余校验”
除原数据信息外,还增加若干位编码,称为校验位。数据检/纠错原理示意图:
- 没有检测到错误,得到的数据位直接传送
- 检测到差错,可以纠正。数据位和比较结果一起送入纠错器,得到正确数据位并传送出去
- 检测到错误,但无法确认哪位出错,因而不能纠错处理,报告出错情况
常用校验码:奇偶校验吗、海明校验码、循环冗余校验码
第三章 运算方法和运算部件
第三章第一讲 高级语言与机器语言涉及的运算及ALU
高级语言程序中涉及的运算
- 整数算术运算、浮点数算术运算
- 按位、逻辑、移位、位扩展和位截断
指令集中涉及到的计算
- 定点数运算
- 带符号整数运算
- 无符号整数运算
- 逻辑运算
- 逻辑操作
- 移位操作
- 基本运算部件ALU的设计
C语言程序中涉及到的计算
-
按位运算
- 用途:对位串实现掩码操作或或相应的其他操作(主要用于对多媒体数据或状态/控制信息将进行处理)
- |按位或 &按位与 ~取反 ^异或
-
逻辑运算
- 用途:关系表示的运算
- || && !
- 与按位与的区别
- 运算过程不同:按位/整体
- 结果类型不同:位串/逻辑值
-
移位运算
-
用途:提取部分信息、扩大或缩小数值的2/4/8/2^n^倍
-
操作:左移x<<k 右移x>>k
-
不区别是逻辑移位还是算术移位,由x的类型确定
-
x为无符号数:逻辑移位——高(低)位移出,低(高)位补0,高位左移1发生溢出
-
x为带符号数:算术移位——左移:高位移出,低位补0,移出位不等于新符号位则溢出
右移:低位移出,高位补符号,可能有效数据丢失
-
-
位扩展和位截断运算
- 数据类型转换可能会出现数据扩展或截断操作,根据类型转换前后数据的长短确定是扩展还是截断
- 扩展:短转长——无符号数0扩展,前面补0;带符号整数符号扩展,前面补符号
- 截断:长转短——强行将高位丢弃,可能发生溢出
-
计算机如何实现高级语言程序中的运算
- 将各类表达式编译为指令序列
- 计算机直接执行指令来完成运算
MIPS运算
MIPS定点算术运算指令 ±*/
MIPS逻辑运算指令 按位与/按位或/按位或非/左移/右移
MIPS定点比较和分支指令 大小比较和相等比较(减法运算实现“比较”操作)
MIPS定点数据传送指令 加/减/符号扩展/0扩展
MIPS浮点算术运算指令 MIPS提供专门的浮点数寄存器 ±*/
MIPS浮点数传送指令 加/减/符号扩展/0扩展 还涉及定点操作:加/减(地址运算)
MIPS浮点数比较和分支指令 比较操作(减法实现) 还涉及定点操作:加/减(地址运算)
实现MIPS定点和浮点运算指令的思路:先实现一个能进行基本加减运算和基本逻辑运算,并生成基本条件码(ZF/OF/CF/NF)的ALU,再由ALU和移位器实现乘、除、浮点运算器
ALU——运算部件的核心
ALU核心部分是加法器,可可进行基本的加减算术运算和逻辑运算。
串行进位加法器
缺点:进位按串行方式传递,速度慢
n位串行加法器从C0到Cn的延迟时间为:2n级门延迟 最后一位和数的延迟时间为:2(n-1)+3 = 2n+1级门延迟
与/或门延迟为1ty,异或门3ty——Carryout延迟为2ty,Sum延迟为6ty
并行进位加法器(CLA加法器)
先行进位方式——串行进位加法器采用串行逐级传递进位,电路延迟与位数成正比关系,故采用先行进位方式
如何产生先行进位:
-
定义辅助函数:G~i~=A~i~B~i~…进位生成函数 P~i~=A~i~+B~i~(1ty)进位传递函数(或P~i~=A~i~B~i~,3ty)
实现以上逻辑的电路称为进位生成/传递部件
- 全加逻辑方程:S~i~=P~i~C~i~(仅P~i~=A~i~B~i~,3ty) C~i+1~=G~i~+P~i~C~i~(i=0,1,…n)(2ty)
- 各进位之间无等待,相互独立并同时产生。实现上述逻辑的电路为4位CLA部件
- 根据全加逻辑方程,并行求出各位和
CLA加法器由“进位生成/传递部件”、“CLA部件”和“求和部件”构成
全先行进位加法器
成本高
上图和的总延迟:3+2+3=8ty(只能用P~i~=A~i~B~i~),进位C~8~的延迟:1+2=3ty或3+2=5ty
局部先行进位加法器(单级先行进位加法器)
用多个位数较少的n位全先行进位加法器进行串联
所有和数的延迟:3+2+2+5=12ty——其实就是最高的8位和的延迟:
- C8:3ty
- C8——C16:2ty(不考虑进位生成/传递部件的1ty,因为C8的延迟大于1ty)
- C16——C24:2ty
- C24——和[31:14]:5ty(CLA部件2ty+求和部件3ty)
单级先行进位加法器虽然比行波加法器延迟时间短,但高位组进位依赖低位组进位,仍有较长的时间延迟
多级先行进位加法器
引入组进位生成/传递函数实现“组内并行,组间串行”进位方式
把实现以上逻辑的电路称为4位BCLA部件。举例:
关键路径长度——5+2+3=10ty
- 5ty = CLA部件2ty+求和部件3ty——4位CLA加法器
- 2ty——4位BCLA部件
- 3ty——4为CLA加法器的求和部件
最终进位延迟——3+2=5ty
4-bit ALU
通过MUX可以实现与、或和加的操作,其他运算操作可以通过增加逻辑电路来实现
1-bit基本ALU:

4-bit串行ALU:

关键路径延迟长,速度慢,不能计算除法
改进:使用并行加法器来构建ALU
第三章第一讲小结
第三章第二讲 定点数运算及运算部件
-
加/减运算及其运算部件
补码、原码、移码 加减运算
-
乘法运算及其运算部件
原码、补码 乘法运算
快速乘法器(自学)
-
除法运算及其运算部件(自学)
原码、补码 除法运算
快速除法器
-
定点运算器
n位整数加/减运算器的逻辑构成
复习:定点整数的机器数是补码形式,[x+y]~补~ = [x]~补~+[y]~补~,[x-y] = [x]~补~+[-y]~补~
实现减法的主要工作:求[-y]~补~——[-y]~补~ = + 1,这一过程也称为求补

有n位,是模2^n^运算系统
当加/减运算电路的结果超出表示范围,即溢出时,结果是错误的——解决:带标志位的加/减运算电路
带标志位的加/减运算电路
比较大小——在加法器中做减法实现,需要使用标志信息来判断大小。整数加/减运算部件(含标志位):

无符号整数和带符号整数的加/减运算电路完全一样,这个运算电路称为整数加/减运算部件(含标志位)
在整数加减运算部件基础上,加上寄存器、移位器和控制逻辑,就可实现ALU、乘除运算以及浮点运算
n位加法器的标志信息的产生
- 溢出标志OF:OF = C~n~C~n-1~
- 符号标志SF:SF = F~n-1~
- 零标志位ZF:ZF = 1当且仅当F=0
- 进位/借位标志CF:CF = C~out~SUB 或 CF = C~out~C~in~
加法时为C~out~,减法时为C~out~取反
所有运算电路的核心:
- 计算机中所有算术运算都基于加法器实现
- 加法器本身不知道所运算的是带符号数还是无符号数
- 加法器不判定对错,总是取低n位作为结果,并生成标志信息
条件标志位(条件码CC)的保存
为什么要生成并保存条件标志:为了在分支指令(条件转移指令)中被用作是否转移执行的条件
条件标志:在运算电路中产生,被记录到专门的寄存器中
零标志ZF,溢出标志OF,进/借位标志CF,符号标志SF
程序/状态字寄存器或标志寄存器:存放标志的寄存器
每个标志对应标志寄存器中的一个标志位
算术逻辑部件(ALU)
进行基本算术运算与逻辑运算(无/带符号加/减,与、或、非、异或等逻辑运算)
核心电路——整数加/减运算部件
有一个操作控制端(ALUop),用来决定ALU所执行的处理功能
ALUop的位数k决定了操作的种类数
eg. 当位数k为3时,ALU最多有2^3^=8种操作

补码加/减运算——直接用整数加减部件实现
发生溢出时会出现两个现象:
- 最高位和次高位的进位不同 OF = C~n~C~n-1~
- 和的符号位和加数的符号位不同 OF = X~n-1~Y~n-1~ + F~n-1~

原码加/减运算
用于浮点数尾数运算
符号位和数值部分分开处理
仅对数值部分进行加减运算,符号位起判断和控制作用
规则如下:
- 比较两数符号,对加法执行“同号求和,异号求差”,对减法执行“异号求和,同号求差”
- 求和:数值位相加,和的符号取被加数(或被减数)的符号。若最高位进位,则溢出
- 求差:加数(或减数)求补后与被加数(被减数)相加
- a. 最高位产生进位(C~out~=1)则无借位(CF=0),表示够减,结果为正,结果即“差”的数值位原码
- b. 最高位无进位(C~out~)则CF=1,结果为负,是“差”的数值位的补码形式,需对结果求补,还原为原码形式的数值位
- 差的符号位:
- 对于a.,符号位取被加数(被减数)的符号
- 对于b.,符号位为被加数(被减数)的符号取反
举个栗子:

移码加/减运算
应用:浮点数的阶码运算
符号位和数值部分可以一起处理
用n位的ALU对两个移码表示的数进行加/减运算:
-
[E1]~移~ + [E2]~移~ = 2^n-1^ + E1 + 2^~^n-1^ + E2 = 2^n^ + E1 + E2 = [E1 + E2]~补~
-
[E1]~移~ - [E2]~移~ = [E1]~移~ + [-[E2]~移~]~补~ = 2~n-1~ + E1 + 2^n^ - [E2]~移~ = 2^n^ + E1 - E2 = [E1-E2]~补~
移码的和/差等于和/差的补码
和/差的移码——符号位取反、数值位相同
-
运算规则(针对标准移码)
- 加法:[E1]~移~和[E2]~移~进行模2^n^加,然后对结果的符号取反
- 减法:先将减数[E2]~移~求补(各位取反,末位加1),然后再与被减数[E1]~移~进行模2^n^相加,最后对结果的符号取反
- 溢出判断:进行模2^n^相加时,如果两个加数的符号相同,并且与和数的符号也相同,则发生溢出(因为和是补码,加数是移码)
举个栗子(n=4):

无符号数的乘法运算
假定[X]~原~ = x~0~x~1~…x~n~,[Y]~原~=y~0~y~1~…y~n~,求[X×Y]~原~ 数值部分z~1~…z~2n~ = (0.x~1~…x~n~) × (0.y~1~…y~n~)
小数点位置可以约定,则整数乘法与小数乘法原理相同
手算过程——两种操作:左移,加法,因此可用ALU和移位器来实现乘法运算



举个栗子:

原码乘法算法
用于浮点数尾数乘法运算
符号与数值分开处理:积符由异或得到,数值用无符号乘法运算
举个栗子:

- 原码一位乘法:每次只取乘数的一位判断,需n次循环,速度慢
- 原码两位乘法:每次取乘数两位判断,只需n/2次循环,快一倍
MIPS中乘数的乘/除运算处理
指令:mult,multu;div,divu
MIPS中有一对32位寄存器Hi与Lo
乘法和除法运算的硬件相同
- 仅需加减和64位寄存器的左右移位
- Hi和Lo结合起来实现64位寄存器
- 乘法:Hi中存放高32位积,Lo中存放低32位积
- 除法:Hi中存放余数,Lo中存放商
mflo/mfhi指令用来把Lo/Hi中的32位数据取到通用寄存器
两种乘法指令忽略溢出,由软件自行处理溢出
- 软件通过mfhi指令取出Hi寄存器来判断是否溢出
- 溢出判断规则:Hi中为以下数值时不溢出,否则溢出
- 无符号数乘指令(multu)时:全0
- 带符号数乘(mult)时:Lo中的符号
MIPS指令不处理“除数为0”,软件自行处理
定点运算部件
所有运算可通过“加”和“移位”操作实现(ALU+移位器+若干寄存器+控制逻辑)
运算部件通常指ALU、移位器、寄存器组,加上用于数据选择的多路选择器和实现数据传送的总线等构成的一个运算数据通路
- 用多个芯片级联实现更长字长运算
- 运算部件和控制键都做在CPU中,CPU中有多个运算空间
“运算器”、“运算部件”、“功能部件”、“执行部件”、“数据通路”含义上一样,只是侧重点不同
第三章第二讲小结

第三章第三讲 浮点数运算
- 浮点数加减运算
- 浮点数乘除运算
- 浮点数运算的精度问题
对阶操作:使两数阶码相等
- 原则:小阶向大阶看齐(0.560×10^2^ ->0.000560×10^5^)
- 方法:阶小的数尾数右移,右移位数等于阶码差
- IEEE 754位数右移时,隐含的“1”移到小数部分,高位补0,移出的低位保留到特定的“附加位”上
浮点数加/减运算
如何对阶:通过计算来判断阶差

何时无法判断阶差:产生溢出时
对IEEE754 SP格式来说,||大于多少时,结果等于阶大的数:24
1.xx…x -> 0.00…01xx…x(SP的尾数长23位,右移24位后,尾数为0)
浮点数加减法的基本要点:
假定Mx、My分别是X和Y的尾数,Ex和Ey分别是X和Y的阶码
- 求阶差:E = Ey - Ex(假定Ey>Ex,则结果的阶码为Ey)
- 对阶:Mx右移E位,尾数变为Mx * 2^Ex-Ey^(保留右移部分:附加位)
- 尾数加减:Mx * 2^Ex-Ey^ My 注意:需要让隐含的位参加运算
- 规格化:
- 尾数高位为0,需左规:尾数左移一位,阶码减1,直到MSB为1,每次阶码减1后要判断阶码是否下溢
- 尾数最高位有进位,需右规:尾数右移一位,阶码加1,直到MSB为1,每次阶码加1后要判断阶码是否上溢
- 阶码溢出异常处理:阶码上溢,结果溢出;阶码下溢,结果为0
- 若尾数比规定位数长,需考虑舍入(有多种舍入方式)
- 若运算结果尾数为0,阶码也置0
举个栗子:

计算机内部执行浮点数加减运算的问题
- 如何表示——IEEE754标准
- 如何判断阶码大小——求[E]~补~
- 对阶时尾数右移隐含位1——右移到数值部分,高位补0,低位部分移出到附加位,附加位包括保护位、舍入位和粘位,共三位
- 如何进行尾数加减——隐藏位还原后,按原码进行加减运算,附加位一起算
- 何时/如何规格化——
- $\pm$1x.xx…x形式,右规:尾数右移1位,阶码加1
- $\pm$0.0…01x…x形式,左规:尾数左移k位,阶码减k
- 如何舍入——去掉附加位时考虑舍入
- 如何判断溢出——阶码全1,上溢;阶码全0,下溢
IEEE754浮点数加法运算举例:

尾数的舍入处理
尾数右移时保留了附加位,并参与运算,最终需要去掉附加位
四种舍入方式:
- 就近舍入:舍入为最近可表示的数(中间值是100,大入小舍)
- 若非中间值:LSB后1位 0舍1入
- 若为中间值:强迫结果为偶数,LSB=0时直接截断,LSB=1时LSB加1
- 向+方向舍入:正向舍入
- 向-方向舍入:负向舍入
- 向0方向舍入:直接截取所需位,后面的位丢弃
浮点数加减的溢出判断
- 左规(阶码减1)时:判断阶码或阶码减1是否全为0,是则置阶码下溢
- 右规(阶码加1)时:判断阶码或阶码加1是否全为0,是则置阶码上溢
- 减1——[Z-1]~移~ = Z~移~ + 255
浮点数乘/除法基本要点
浮点数尾数采用原码乘/除运算
浮点数乘法:x * y = (M~x~ * M~y~) × 2^Ex+Ey^ = M~b~ × 2^Eb^
浮点数除法:x / y = (Mx / My) × 2^Ex-Ey^ = M~b~ × 2^Eb^
浮点数乘/除发步骤:
-
求阶:Ex Ey 127
-
尾数相乘除:Mx *或/ My (两个形为1.xxx的数相乘/除)
-
两数符号相同,结果为正;两数符号相异,结果为负
-
尾数高位为0,左规;最高位为进位,右规
乘法不需左规,最多右规1次;除法不需右规,最多左规1次
-
若尾数比规定的长,考虑舍入(方法和加减法一致)
-
若尾数为0,阶码置零
-
阶码溢出判断
浮点数乘除的溢出判断
- 乘法运算求阶码的和时:
- 若Ex和Ey最高位皆1,而结果E~b~的最高位是0或为全1,阶码上溢
- 若Ex和Ey最高位皆0,而结果E~b~的最高位是1或为全0,阶码下溢
- 除法运算求阶码的差时:
- 若Ex的最高位是1,Ey的最高位是0,结果E~b~的最高位是0或为全1,阶码上溢
- 若Ex的最高位是0,Ey的最高位是1,结果E~b~的最高位是1或为全0,阶码下溢

求阶码的和、差
设Ex和Ey分别是两个操作数的阶码,Eb是结果的阶码:
-
阶码加法公式:E~b~ = Ex + Ey + 129
-
阶码减法公式:E~b~ = Ex + [-Ey~补~] + 127
举个栗子:

第三章第三讲小结

第四章 指令系统
第四章第一讲 指令系统的设计
指令:由操作码和操作数(或其地址码)组成
- 操作码:定义操作的类型
- 操作数:指示操作的源和目的
一条指令必须显示或隐式地包含以下信息
- 操作码:指定操作类型
- 源操作数或其地址:一个或多个源操作数所在的地址
- 结果的地址:产生的结果存放和粗(目的操作数)
- 下一条指令地址:下条指令存放何处
指令的地址码字段
不同机器系统不同,同一指令系统中不同指令也可能不同
-
零地址指令:无需操作数/操作数是默认位置
-
一地址指令:地址既是操作数的地址,也是结果的地址 单目/双目运算
-
二地址指令(CISC中最常用):存放双目运算中两个操作数,一个地址作为结果的地址
-
三地址指令(RISC风格):双目运算中两个源操作数的地址和一个结果的地址
-
多地址指令:成批数据处理的指令
操作数类型和存储方式
基本类型有:
- 地址(指针)
- 数值数据
- 位、位串、字符和字符串:表示文本、声音和图像
- 逻辑(布尔)数据:按位操作
寻址方式——根据地址找到指令或操作数的方法
指令中的地址码编码由操作数的寻址方式决定
地址码编码的三个原则:
- 地址码尽量短——目标代码短,省空间
- 操作数存放位置灵活,空间尽量大——利于编译器优化产生高效代码
- 地址计算过程简单——指令执行快
指令的寻址方式——简单
- 顺序执行:PC增值
- 跳转:与操作数的某些寻址方式相同
操作数的寻址方式——复杂——通常“寻址方式”指这个
- 操作数来源:寄存器/主(虚)存/外设端口/栈顶
- 操作数结构:位/字节/半字/字/双字/一维表/二维表/…
指令表示寻址方式:
- 不设专门的寻址方式位 如MIPS
- 在指令中设置专门的寻址方式位
有效地址:操作数所在存储单元的地址(逻辑或物理),可通过指令的寻址方式和地址码得到
基本寻址方式:立即、直接、间接、寄存器、寄存器间接、偏移、堆栈
只有当操作数在存储器中时,才有可能“缺页”,此时操作数在磁盘中
偏移寻址方式
偏移寻址:EA = A + ®,R可以明显/隐式给出,可以为PC、基址寄存器B、变址寄存器I
-
相对寻址:EA = A + (PC) 相对于当前指令处位移量为A的单元
指令地址码给出一个偏移量(带符号数),基准地址隐含由PC给出
可用来实现程序(公共子程序)的浮动 或 指定转移目标地址
-
基址寻址:EA = A + (B) 相对于基址(B)处位移量为A的单元
指令地址码给出一个偏移量,基准地址明显或隐含由基址寄存器B给出
可用来实现多道程序重定位 或 过程调用中参数的访问
-
变址寻址:EA = A + (I) 相对于首址A处位移量为(I)的单元
指令地址码给出一个基准地址,偏移量(无符号数)明显或隐含由变址寄存器I给出
可为循环重复操作提供一种高效机制,如实现对线性表的方便操作
-
自动变址:EA = (I) + A
指令中的地址码A给定数组首址,变址器I每次自动加/减数组元素的长度x
RISC机器不提供自动变址寻址,将变址和基址寻址统一成一种偏移寻址方式
操作码编码方式
操作码编码方式:
- 定长操作码编码
- 扩展操作码编码(变长操作码编码)
选择依据:
- 代码长度更重要时:变长指令字、变长操作码
- 性能更重要时:定长指令字、定长操作码
定长操作码编码
基本思想:指令的操作码部分采用固定长度的编码
特点:译码方便,可能有信息冗余
举例:
- IBM360/370采用:
- 8位定长操作码,最多有256条指令
- 只提供了183条指令,有73种编码为冗余信息
- 机器字长32位,按字节编址
- 有16个32位通用寄存器,基址器B和变址器X可用其中任意一个
通用寄存器编号有4位,B和X编号占4位

扩展(变长)操作码编码
基本思想:将操作码的编码长度分成几种固定长的格式。被大多数指令集采用,PDP-11典型
种类:
- 等长扩展法:4-8-12;3-6-9
- 不等长扩展法
举例:

条件测试方法
条件转移指令通常根据Condition Codes(条件码CC/状态码/标志位)转移
一般通过执行算术指令或比较指令,然后用测试指令来检测CC

常用的标志(条件码)有四种:
-
SF - negative
-
OP - overflow
-
CF - 进位/错位
借位生成:C~out~sub
-
ZF - zero

标志可存于标志寄存器(也叫条件码寄存器、状态寄存器、程序状态字寄存器),也可由指定的通用寄存器来存放标志位
可以将两条指令合成一条指令,即:计算并转移
指令系统设计风格——不同操作数地址指定方式
- 累加器型:一个操作数(源操作数1)和目的操作数总在累加器中
- 堆栈型:总是将栈顶连个该操作数进行运算,指令无需指定操作数地址
- 通用寄存器类型:操作数可以是寄存器或存储器数据(A、B、C可以是寄存器或存储单元)
- 装入/存储型:运算指令的操作数只能是寄存器数据,只有load/store能访问存储器

对于复杂表达式,累加器型风格指令条数变多
寄存器型(后两种)占主导地位,原因:①寄存器速度快,使用大量通用寄存器可减少访存操作 ②表达式编译时与顺序无关(相对Stack)
复杂指令集计算机CISC与精简指令集计算机RISC
2/8规律:
- 简单指令占程序80%,占指令系统20%
- 微程序控制的计算机中,程序只占指令总数20%的复杂指令占用了控制存储器容量的80%
1975年开始研究指令系统的合理性问题,提出RISC,1982年出现第一代RISC机。MIPS是典型的RISC处理器
RISC的主要特点:
-
简化的指令系统
指令/寻址方式/指令格式少 指令长度一致
-
RR方式工作
Load/Store指令可访问存储器外,其余指令只访问寄存器
-
指令周期短
流水线方式工作,除Load/Store指令外,其他简单指令都只要一个/不到一个时钟周期
-
采用大量通用寄存器,减少访存次数
-
采用硬连线控制器控制,不用/少用微程序控制
-
采用优化的编译系统,支持高级语言程序
第四章第一讲小结

第四章第二讲 程序的机器级表示——以MIPS为例
-
MIPS的指令格式
R型 I型 J型
-
MIPS的寄存器
长度 个数 功能分配
-
MIPS的指令寻址方式
立即数寻址 寄存器寻址 PC相对寻址 伪直接寻址 偏移寻址
-
MIPS的汇编形式与指令的对应
操作码的表示 寄存器的表示 存储器数据表示
MIPS的指令格式
所有指令都是32位宽(字长),按字地址对齐存储,字地址为4的倍数
R型、I型、J型
R型指令
- 参与运算的操作数和结果都在寄存器,R型指令的寻址方式只有寄存器寻址一种
- R型指令的op全为0,具体功能由func部分确定
- rs:第一个源操作数
- rt:第二个源操作数
- rd:目的寄存器
- shamt:对非移位指令为00000。移位指令为移位次数
举个栗子:


I型指令
- 指令中包含了一个立即数,故称I型指令
- op:确定指令的功能
- rs:可以是一个源操作数,寄存器寻址;或者在存取指令中用作基址寄存器,偏移寻址
- rt:目的寄存器
- immediate:长度为16位的立即数,指令执行时需扩展为32位。根据指令的不同有三种用法:
- 运算类指令:以立即寻址方式提供一个源操作数
- 存取指令:作为偏移量,与寄存器rs组成偏移寻址方式,提供一个存储器操作数
- 条件转移指令:作为偏移量,与PC寄存器组成相对寻址方式,提供一个转移目的地址


J型指令
- op:确定指令功能
- address:转移地址
指令 | [31:26] | [25:0] | 功能 |
---|---|---|---|
j | 000010 | address | 跳转 |
jal | 000011 | address | 调用 |

MIPS的通用寄存器
MIPS有32个长度为32位的通用寄存器(整数寄存器):

说明:
- 0号寄存器$zero为固定值零,不能改变
- 1号寄存器$at被汇编器保留为专用
- $k0和$k1是留给操作系统专用
- $fp是用于过程调用时,访问保存在栈中的数据的指针。但有的编译器(如MIPS 的C编译器)不使用,将它作为$s8寄存器使用
- 在汇编语言中使用寄存器时可以用寄存器名,也可以用寄存器号,前面加上“$”,例如,$8或$t0
- MIPS还提供了32个32位的单精度浮点寄存器$f0~$f31,用于浮点数指令。它们可配对成16个64位的双精度浮点寄存器
MIPS寻址方式
寄存器寻址 立即数寻址 偏移寻址 PC相对寻址 伪直接寻址:

举个栗子:


高级语言语句的汇编指令表示:
直接举个栗子:





第四章第二讲小结

第四章总结



第五章 中央处理器:数据通路和控制器
第五章第一讲 CPU的基本功能和基本组成
- CPU的功能及其与计算机性能的关系
- 指令的四个基本功能
- 数据通路的基本结构
- 常用的操作元件
- 常用的状态元件:寄存器组与存储器
- 数据通路的时序控制
- 总线结构数据通路中四种基本功能的实现
CPU及其与计算机性能的关系
CPU的实现与计算机性能的关系:
计算机性能(程序执行时间)由三个关键因素决定:指令数目、CPI、时钟周期
指令数由编译器和ISA决定
时钟周期和CPI由CPU的实现以及其他因素来决定
组成指令功能的四种操作
- 取指、取数:读取某一主存单元的内容,并将其装入某个寄存器
- 存结果:把一个数据从某个寄存器存入给定的主存单元
- 取数、存结果:把一个数据从某个寄存器送到另一个寄存器或者ALU
- PC+1、计算地址、运算:执行算数或逻辑运算
RTL:寄存器传送语言,具体规定如下:
- 用R[r]表示寄存器r的内容;
- 用M[addr]表示主存单元addr的内容;
- 传送方向用“←”表示,传送源在右,传送目的在左;
- 对于程序计数器PC,直接用PC表示其内容。
举个栗子:
R[$8]←M[R[$9]+4]的含义是:将寄存器9的内容加4得到的内存地址单元的内容送寄存器$8中

数据通路
计算机的五大组成结构:

数据通路:指令执行过程中,数据经过的路径,以及路径上的部件(完整定义:由操作元件和存储元件通过总线方式或分散方式连接而成的进行数据传送、处理和存储的路径。 )
包括:ALU 通用寄存器 状态寄存器 MMU cache 中断处理逻辑
数据通路中专门进行数据运算的部件称为执行部件或功能控件
控制器功能:对指令移码,生成指令对应的控制信号,控制数据通路的动作。控制器向执行部件发出控制信号,是指令的控制部件
数据通路的基本结构:
-
数据通路由两类元件组成
- 组合逻辑元件(操作元件)
- 时序逻辑元件(状态元件、存储元件)
-
元件间的连接方式有两种方式
- 总线连接方式、
- 分散连接方式
-
数据通路如何构成:由“操作元件”和“存储元件”通过总线方式或分散方式连接而成
-
数据通路的功能:进行数据传送、处理和存储
状态元件:时序逻辑电路
特点:①存储功能,时钟控制 ②输入端状态由时钟决定何时被写入,输出端随时可以读出
定时方式:边沿触发方式:只在时钟边沿改变。上升沿触发/下降沿触发
最简单的状态单元:D触发器,一个时钟输入,一个状态输入,一个状态输出
存储元件**:寄存器(组)和存储器**
状态单元的输入信息总是在一个时钟的有效边沿到达后的“Clk-to-Q”时才被写入单元中,此时的输出才反映新的状态值
- 寄存器:有一个写使能信号,时钟有效边沿,WE=0时输出不变,WE=1时输出等于输入。每个时钟边沿都写入就不需要WE信号
- 寄存器组:包含32个寄存器
- 两个读口(组合逻辑操作): busA和busB分别由RA和RB选择32个寄存器之一输出。地址RA或RB有效后,经一个“取数时间”,busA和busB有效
- 一个写口(时序逻辑操作):写使能为1,时钟边沿触发,busW上的值开始被写入RW指定的寄存器中
存储元件:理想存储器
理想存储器——简化为带时钟信号Clk的理想模型

Data Out:32位读出数据
Data In:32位写入数据
Address:读写共用一个32位地址
读操作(组合逻辑操作):地址Address有效,经过一个取数时间"AccessTime",DataOut数据有效
写操作(时序逻辑操作):写使能为1,时钟Clk有效边沿到来时,Data In传来的值开始被写入Address指定的存储单元中
数据通路与时序控制
同步系统:所有动作由专门时序信号来定时 ,时序信号规定何时发出什么动作
指令周期:读取并执行一条指令的时间
现代计算机的时钟周期:

数据通路由“…+状态元件+操作元件(组合电路)+状态元件+…”组成
只有状态元件能存储信息,操作元件从状态元件接收输入,并将输出写入状态元件
操作元件的输入为前一时钟状态元件生成的数据,输出为当前时钟状态元件所用的输入数据
假定采用下降沿触发(负跳变)方式:
所有状态单元字下降沿写入信息,经过锁存延时后输出有效
时钟周期 = Latch Prop + Longest Delay Path + Setup + Clock Skew(时钟偏移)
约束条件:(Latch Prop + Shortest Delay Path - Clock Skew)> Hold Time
即:操作元件输出有效信号最快必须在下一级状态元件的输入保持时间之后出现
总线结构数据通路
四种基本操作的时序:
-
寄存器间传送数据:Y←R[R0]
R0out,Yin
-
完成算术、逻辑运算:R[R3]←R[R1] + R[R2]
R1out,Yin
R2out,Add,Zin
Zout,R3in
-
从主存取数:R[R2]←M[R[R1]]
R1out,MARin
Read,WMFC(等待MFC)
MDRout,R2in
-
写数到主存:M[R[R1]]←R[R2]
R1out,MARin
R2out,MDRin
Write.WMFC
CPU访存有两种通信方式:
- 早期:直接访问MM,“异步”方式,用MFC(存储器完成)信号进行应答
- 现在:先Cache后MM,“同步”方式,无需应答信息

三总线数据通路
多总线方式,在多个总线上传送不同数据,提高效率
举个栗子:
总线AB分分别传送两个源操作数,总线C传送结果
单总线中的暂存器Y和Z(ALU两侧)在此可取消——三个总线传不同数据,不会发生冲突
采用双口通用寄存器组
如何实现:R[R3]←R[R1] op R[R2]
R1outA,R2outB,op,R3inC

目前大都采用流水线方式执行指令,单总线或三总线的总线式数据通路很难实现指令流水执行
第五章第一讲小结

第五章第二讲 单周期MIPS处理器的设计

处理器设计涉及到数据通路的设计和控制器的设计
数据通路中有两种元件:由组合逻辑电路实现的操作元件、由时序逻辑电路实现的存储(状态)元件
取指令公共操作及其部件
每条指令都有公共操作:
- 取指令:M[PC]
- 更新PC:PC←PC+4
转移时,PC内容要再次被更新为“转移目标地址”。单周期CPU的时钟周期以下降开始,在本时钟周期中PC不变
两个操作的顺序:先取指令,再改PC值

加法和减法指令(R-type类型)
R型指令:

add rd, rs, rt的RTL描述
- M[PC] 从PC所指内存单元中取指令
- R[rd]←R[rs] + R[rt]
- rs、rt所指寄存器中取数后相加
- 结果不溢出,结果送rd所指寄存器
- 结果溢出,不送结果,转“溢出处理程序”
- PC←PC + 4 PC加4,使PC指向下一条指令

带立即数的逻辑指令(ori指令)
I型指令:

作为I-Type指令和逻辑运算指令的代表
ori rt, rs, imm16的RTL描述
- M[PC] 取指令(公共操作,取指部件完成)
- R[rt]←R[rs] or ZeroExt(imm16) 立即数零扩展,并与rs内容做“或”运算
- PC←PC + 4 计算下地址(公共操作,取指部件完成)
零扩展 ZeroExt(imm6)


访存指令中的输入指令(lw指令)
还是I型指令
lw rt, ts, imm16的RTL描述:
- M[PC] 取指令
- Addr←R[rs] + SignExt(imm16) 计算存储单元地址(立即数符号扩展)
- R[rt]←M[Addr] 装入数据到寄存器rt中
- PC←PC + 4 计算下地址(公共操作、取指部件完成)
符号位扩展SignExt(imm16)


访存指令中的存数指令(sw)
I型指令
sw rt, rs, imm16的RTL描述:
- M[PC] 取指令(公共操作,取指部件完成)
- Addr←R[rs] + SignExt(imm16) 计算存储单元地址(符号扩展)
- M[Addr]←R[rt] 寄存器rt中的内容存到内存单元
- PC←PC + 4 计算下地址(公共操作,取指部件完成)

分支(条件转移)指令(相等转移:beq)
I型指令
beq rs, rt, imm16的RTL描述:
-
M[PC]
-
Cond←R[rs] - R[rt]
-
if(Cond eq 0)
PC←PC + 4 + (SignExt(imm16) × 4)
else
PC←PC + 4

下地址计算逻辑的设计:
- 顺序执行:PC<31:2> = PC<31:2> + 1
- 转移执行:PC<31:2> = PC<31:2> + 1 +SignExt[imm16] (SignExt扩展成30位)
- 取指令时:指令地址 = PC<31:2>串接“00”
无条件转移指令
Jump指令(无条件转移指令的代表)

j target的RTL描述:
- M[PC] 取指令(公共操作,取指部件完成)
- PC<31:2>←PC<31:28>串接target<25:0> 计算目标地址
跳转指令是绝对寻址,转移范围是j指令所在的2^28^=256MB页面内,页面号与j指令相同PC<31:28>

取指令部件(修改后电路):

实现7条MIPS指令的单周期处理器的数据通路

数据通路 中关键路径(Load)操作花费的时间
Load操作:R[rt]←M[R[rs]+imm16]
寄存器组和理想存储器的定时方式:
-
写操作时,作为时序逻辑电路
时钟到达前,输入需“建立时间(setup time)”;到达后经“Clk-to-Q”时间后写入数据到达输出端
-
读操作时,作为组合逻辑电路
地址有效后经过“取数时间(access time)”,输出开始有效

数据通路设计小结

单周期数据通路的控制器设计:
妈的 爷不写了