第一章 计算机系统概述
计算机系统的发展
计算机系统 = 硬件 + 软件
软件
系统软件:用来管理整个计算机系统
应用软件:按任务需要编制成的程序
硬件
第一台电子数字计算机:ENIAC
-
逻辑元件(用于处理电信号的最小单元):电子管
-
十进制表示,手动编程
-
无冯 · 诺伊曼结构
第二代:晶体管
- 元器件:逻辑元件(晶体管),内存(磁芯),外存(磁鼓,磁带)
- 特点:变址,浮点运算,多路存储器,I/O 处理机,中央交换结构(非总线)。
- 软件:使用高级语言,提供系统软件。
第三代:中小规模集成电路
- 元器件:逻辑元件和主存储器均由集成电路实现。
- 特点:微程序控制,Cache,虚拟存储器,流水线。
- 代表机种:IBM 360(大型机),DEC PDP-8(小型机),巨型机。
IBM 360(兼容机)
相同/相似的指令集&操作系统。
好处: 原来机器上的程序可以不改动而在新机器上运行,但性能不同。
保持兼容的关键:低端机指令集是高端机的一个子集,称为“向后兼容”。
DEC PDP-8(采用总线结构)
总线结构好处:可扩充性好(允许将新的符合标准的模块插入总线,形成各种配置),节省器件,体积小,价格便宜
第四代:大规模、超大规模集成电路
- 半导体存储器,微处理器发展迅速。
- 特点:共享存储器,分布式存储器以及大规模并行系统。
组成
冯诺依曼结构模型
冯诺依曼提出存储程序,取代手动接线。
冯诺依曼结构:
- 计算机由运算器,控制器,存储器,输入设备和输出设备五个基本部件组成。
- 各基本部件功能:
- 存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;
- 控制器应能自动执行指令;
- 运算器应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算;
- 操作人员可以通过输入设备和输出设备与主机进行通信。
- 内部以二进制数表述指令和数据
- 每条指令由操作码和地址码两部分组成。操作码指出操作的类型,地址码指出操作数的地址。
- 由一串指令组成程序。
- 采用存储程序工作方式
- 将事先编好的程序和原始数据送入主存中;启动执行后,在不需操作人员干预下,自动完成逐条取出指令和执行指令的任务。

基本部件及其功能
- 运算器(数据运算):ALU、GPRs、标志寄存器等。
- 存储器(数据存储):存储阵列、地址译码器、读写控制电路
- 总线(数据传送):数据线(MDR)、地址线(MAR)和控制线
- 控制器(控制):对指令译码生成控制信号
CPU = 运算器 + 控制器
主机 = CPU + 主存
各硬件工作原理
主存储器
主存储器 = 存储体 + MAR + MDR
- Memory Address Register 存储地址寄存器:指示位置,位数反应存储单元的个数
- Memory Data Register 存储数据寄存器:指示存入、取出的具体数据(包括指令)
- 存储体:数据、指令在存储体内按地址存储,每个存储单元对应一个地址
1B = 1 byte ; 1 b = 1 bit
MAR、MDR 逻辑上属于主存,但被集成到 CPU
运算器
实现算数运算、逻辑运算
运算器 = ACC + ALU + MQ + X
- Accumulator:累加器,存放操作数或运算结果
- Multiple-Quotient Register:乘商寄存器,乘除运算时,存放操作数或运算结果
- Arithmetic and Logic Unit:算数逻辑单元,通过复杂电路实现算数运算、逻辑运算
- X:通用的操作数寄存器,用于存放操作数
控制器
控制器 = CU + IR +PC
-
Control Unit:控制单元,分析指令,给出控制信号
-
Instruction Register:指令寄存器,存放当前执行的指令
-
Program Counter:程序计数器,存放下一条指令地址,有自动加1功能
配合

指令和数据
- 程序启动前,指令和数据都存储在存储器中,形式上没有区别,都是 0/1 序列。
- 采用存储程序的工作方式,程序由指令组成,启动后计算机自动取出一条条指令并执行,无需人的干预。
- 指令执行过程中,指令和数据从存储器取到 CPU,指令存在 IR 中,数据在 GPR 中。
- 指令需要给出的信息
- 操作码:指令的操作,加减法等
- 一个或多个源操作数:立即数、寄存器编号、存储地址
- 目的操作数地址:寄存器编号、存储地址
执行过程
- 程序执行前
- 数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放。指令由 OP、ADDR 字段组成,程序起始地址送入 PC。
- 开始执行程序
- 根据 PC 取指令送 IR:PC -> MAR ->存储器 -> MDR -> IR
- 指令译码:IR -> 控制器,控制器译码
- 取操作数:GPRs 或存储器 -> ALU
- 执行指令操作:ALU 运算
- 回写结果到 GPRs 或存储器
- 修改 PC 的值,使其指向下一条指令
- 重复上述步骤直到程序完成
软件
- 系统软件——简化编程,使硬件资源被有效利用
- 操作系统:硬件资源管理,用户接口
- 语言处理程序:翻译程序,Linker,Debug…
- 翻译程序
- 汇编器(Assembler):汇编语言源程序->机器目标程序。或许叫汇编器更好理解?
- 编译器(Complier):高级语言程序->汇编/机器目标程序。或许叫编译器更好理解?
- 解释器(Interpreter):将高级语言程序语句逐条翻译成机器指令并执行,不生成目标文件。(跳过汇编阶段)
- 翻译程序
- 其他实用程序:磁盘碎片整理、备份程序…
机器语言:二进制代码
汇编语言:助记符
高级语言:C、C++、……
- 应用软件——解决具体的应用问题
层次结构
语言层次
- 微指令系统:直接控制硬件执行
- 机器语言:传统机器M1,执行二进制机器指令
-
操作系统机器
-
汇编语言:虚拟机器M2,用汇编语言翻译成机器语言
-
高级语言:虚拟机器M3,需要编译成汇编、机器语言
上两层视为硬件层
计算机体系结构:讨论如何设计硬件与软件之间的接口
计算机组成原理:讨论如何用硬件实现接口

ISA
指令集体系结构,其作为规约,规定了如何使用硬件。
- 可执行的指令集合,包括指令格式、操作种类以及对应操作数的规定。
- 可以接受的操作数类型。
- 操作数存放的寄存器组结构,例如寄存器名称、编号、长度和用途。
- 操作数存放的存储空间的大小和编址方式。
- 操作数在存储空间中按大/小端方式存放。
- 指令获得操作数的方式,即寻址方式。
- 指令执行过程的控制方式,例如程序计数器,条件码定义等。
ISA 是计算机系统中必不可少的抽象层。
性能指标
存储器
总容量 = 存储单元个数 * 存储字长(bit)
CPU
基本概念
-
主频:CPU内数字脉冲信号振荡的频率
-
- = 1 / 时钟周期
-
CPI:执行一条指令需要多少个时钟周期(不同指令,CPI不同)
-
CPU执行时间:执行整个程序的耗时 = (条数 * CPI) / 主频
-
IPS:每秒执行多少个命令 = 主频 / 平均CPI
-
FLOPS:每秒执行多少次浮点运算
K=Kilo=千=10^3
M=Million=百万=10^6
G=Giga=十亿=10^9
T=Tera=万亿=10^12
-
数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)
-
吞吐量:单位时间内处理请求的数量
-
相应时间:CPU时间 + 等待时间
-
基准程序:用于测量的程序
MIPS(Million Instructions Per Second):每秒执行多少百万条指令,着重点在于单条指令。
MIPS 为平均值,其并没有考虑以上三个属性,并且由于:
- 不同机器指令集不同
- 程序由不同指令混合而成
- 指令的频率会动态变换
- 厂家给出峰值 MIPS
因此,MIPS 表示性能存在局限性。
MFLOPS:每秒执行浮点运算多少百万次,着重在于浮点操作本身。
计算
CPU 执行时间=CPI×程序总指令条数×时钟周期

第二章 数据的机器级表示
信息二进制编码
计算机内部数据:二进制表示
机器级数据:
- 数值数据,无符号/带符号整数,浮点数,十进制数
- 非数值数据,逻辑数,汉字
二进制编码原因:
- 制造两个稳态的物理器件容易
- 二进制编码、计数、运算规则简单。
- 与逻辑命题对应,便于逻辑运算,方便地用逻辑电路实现算术运算。
机器数:0/1 编码的 0/1 内部 0/1 序列。
真值:机器数真正的值
数值数据表示方法
三要素:
- 进位计数制:十进制,二进制等转换。
- 定点浮点表示:定点整数/小数;浮点数(使用一个定点小数和一个定点整数表示)
- 编码:原码补码反码等。
若不知道三要素,那么便无法得知机器数的具体真值。
进制转换:
- 二进制 -> 其他:划分位数,对应
- 十六、八 -> 二:位数对应,补全
- 十进制 -> 任意位数:求商取余
定点数的表示
常规计数,小数点位置固定。整数、小数分开存储。
-
无符号数:没有符号位
-
原码:
- 有 +0、-0 两种表示形式
-
反码:
- 正数与原码相同
- 若符号位为1,则数值位全部取反
- 依然有 +0、-0
-
补码:
- 将减法抓换为等价的加法(加上补数)
- = 原码除符号位外,取反后加一(即反码 + 1)
-
移码: 将每一个数值加上一个偏置常数( bias)
-
一般来说,当编码位数为 n **时,bias 取 2^n 标准移码
-
为什么要用移码来表示阶码?
-
便于浮点数加减运算时的对阶操作(比较大小)
-
与补码的关系:最高位相反,其余位相同
-
C语言的解析
无符号数变为有符号:不改变数据内容,改变解释方式
长变短:高位截断,保留地位
短变长:符号扩展
- 负数补1,正数补0
IEEE编码
规定了二进制浮点数算数标准,类似科学计数法简化计数
二进制浮点数
-
符号:决定数值的正负性
-
尾数:影响数值的精度。尾数的位数越多,精度越高
-
阶码:反映小数点的实际位置
-
基数:K进制通常默认基数为K
-
规格化:石确保尾数的最高位非0数位刚好在小数点之前
float型:32位单精度
- 符号 + 阶码 + 尾数:1 + 8 + 23
double型:64位双精度
- 符号 + 阶码 + 尾数:1 + 11 + 52
float单精度
-
默认存储规格化尾数,小数点前的1省略(隐含)
-
基数规定为 2
-
阶码用移码表示,规定偏置值为 127
如何将十进制真值转换为偏置值为M的移码?
将十进制真值+偏置值
按“无符号整数”规则转换为指定位数
double双精度
- 偏置值为1023
表示范围
特殊状态
阶码全 0,或阶码全 1
- 阶码真值的取值范围为 -126 ~ 127(单精度)

根据数轴,存在:
- 正上溢、正下溢、负上溢,负下移
- 上溢置为无穷,下溢置为0

数据表示
十进制数表示
-
ASCII 码:就是把数字当作字符存储,0-9用30H-39H表示
- 前分隔:正号用 2B 负号用 2D 放在最前面
- 后嵌入:将符号嵌入最低位数字的 ASCII 码高 4 位中。
- 正数不变;负数高 4 位变为 0111。
-
BCD 码
- 每 1 位十进制数用 4 位二进制表示。而 4 位二进制数可组合成 16 种状态,只需要选 10 种状态来表示十进制数。
西文字符表示:
复习要点中未提到
- 十进制数字:0/1/2…/9 10 个
- 英文字母:A/B/…/Z/a/b/…/z 52 个
- 专用符号:+/-/%/*/&/…… 33 个
- 控制字符(不可打印或显示) 33 个
汉字表示
- 输入码:用于输入汉字。
- 内码:用于在系统中进行存储、查找、传送等处理
- 字模点阵或轮廓描述:用于显示/打印
数据的宽度
- bit
- 字节:
- 现代计算机中,存储器按字节编址
- 字节是最小可寻址单位 (addressable unit )
- LSB 表示最低有效字节,MSB 表示最高有效字节
- 字
- 表示被处理信息的单位,用来度量数据类型的宽度
- 字长
- 指某特定机器定点运算时数据通路的宽度。
- 数据通路: CPU 内部进行数据运算、存储和传送的路径以及路径上的部件。
- 等于 CPU 内部总线的宽度,或运算器的位数,或通用寄存器的宽度。
数据的存储和排列顺序
- 大小端
- 小端( Little Endian):低字节放低地址
- 大端( Big Endian):高字节放低地址
- 指令中,操作码和寄存器号的存放顺序不变,只需要考虑立即数的顺序
- 对齐:要求数据存放的地址必须是相应的边界地址
- 每次访存只能读写一个字
- 浪费一定空间,换取存取时间

数据的检错与纠错
大多采用“冗余校验”思想,即除原数据信息外,还增加若干位编码,这些新增的代码被称为校验位。
- 奇偶校验码
- 海明校验码
- 循环冗余校验码
第三章 运算方法和运算部件
加法器
串行进位
传递速度慢
并行进位
-
用先行进位优化,各进位之间无等待,相互独立并同时产生
-
但全先行电路复杂,成本高
-
局部先行进位加法器: 组内并行、组间串行
- 用多个位数较少的 n 位全先行进位加法器进行串联
-
多级先行进位加法器: 组内并行、组间并行
ALU的构成
- ALU 如何控制实现加、减、与、或等等各种功能;
- 无符号整数和带符号整数的加、减运算电路完全一样,这个运算电路称为整数加/减运算部件。
- 在整数加/减运算部件基础上,加上寄存器、移位器以及控制逻辑,就可实现 ALU、乘/除运算以及浮点运算。
- ALU 的 OF、SF、CF 和 ZF 标志信息如何产生。
- 零标志 ZF、溢出标志 OF、进/借位标志 CF、符号标志 SF 称为条件标志。
- 条件标志(Flag)在运算电路中产生,被记录到专门的寄存器中
- 存放标志的寄存器通常称为程序/状态字寄存器或标志寄存器。

溢出条件:
- 无符号加、减溢出条件:CF=1
- 带符号加、减溢出条件:OF=1
定点数运算
移位
逻辑移位
-
针对无符号数
-
左移 n 位,即乘上位权的 n 次方。
-
高位溢出丢弃,低位补 0
算数移位
- 左移与逻辑移位类似,但移到符号位结果更改
- 右移:低位移出丢弃,但高位补符号位,若移出 1,则发生精度丢失
加减
原码
- 减法用减法器实现,1 变 0
补码
- 符号位可以一起参与运算
- [A+B]补=[A]补+ [B]补
- [A-B]补=[A]补+[-B]补
[-B] 补 = [B] 补的 “取反加 1”,符号位也参与取反
- 溢出判断:上溢正变负;只有可能同号运算出现;判断是否在合法表示范围内即可
乘法
无符号整数:
- 模拟手算乘法即可,计算机还需拆分部分积
具体实现:

带符号整数
给无符号整数乘法电路添加一辅助位,让符号位参与运算。
计算机底层判断溢出:
- 若 2n 位的高 n + 1 位不均相同,则溢出
实现方式
- ALU + 移位器 + 寄存器 + 控制逻辑
- 阵列乘法器
- 逻辑运算模拟
浮点数运算
-
浮点数加减运算的对阶原则和方法;
-
原则:小阶向大阶看齐
-
方法:阶小的那个数的尾数右移,右移位数等于两个阶码差的绝对值
-
IEEE 754 尾数右移时,要将隐含的“1”移到小数部分,高位补 0,移出的低位保留到特定的“附加位”上
-
-
如何计算移码表示的阶码的和与差(标准移码与 IEEE754 移码有什么差别);
-
阶码加法公式为: Eb ← Ex + Ey + 129 ( mod 2^8)
-
阶码减法公式为: Eb ← Ex + [–Ey]补 + 127 ( mod 2^8)
-
-
如何计算一个移码数减 1
-
尾数规格化中的右规和左规方法;
- 当尾数高位为 0,则需左规:尾数左移一次,阶码减 1,直到 MSB 为 1
- 每次阶码减 1 后要判断阶码是否下溢
- 先判断阶码是否为全 0,若是,则直接置阶码下溢;否则,阶码减 1 后判断阶码是否为全 0,若是,则阶码下溢。
- 当尾数最高位有进位,需右规:尾数右移一位,阶码加 1,直到 MSB 为 1
- 每次阶码加 1 后要判断阶码是否上溢
- 先判断阶码是否为全 1,若是,则直接置阶码上溢;否则,阶码加 1 后判断阶码是否为全 1,若是,则阶码上溢。
- 阶码溢出异常处理:
- 阶码上溢,则结果溢出;
- 阶码下溢,则结果为 0
- 乘法运算结果不需左规!最多右规 1 次!
- 除法最多左规 1 次!不需右规!
- 当尾数高位为 0,则需左规:尾数左移一次,阶码减 1,直到 MSB 为 1
-
尾数的舍入处理常用方法;
- 就近舍入:舍入为最近可表示的数
- 若为非中间值:LSB 后 1 位 0 舍 1 入
- 若为中间值:强迫结果为偶数, LSB=
- 1.1101110 → 1.1110 (1.1101110 → 1.1110, 110>100, 1.1101+0.0001 = 1.1110)
- 1.1101011 → 1.1101 (1.1101011 → 1.1101, 011<100, 1.1101+ 0 = 1.1101)
- 1.1101101 → 1.1110
- 1.1111100 → 10.0000 (1.1111100 → 10.0000, 100=100, 1.1111+0.0001 = 10.0000)
- 朝+∞方向舍入:舍入为右边最近可表示数 (正向舍入)
- 例:-1.1101101 →-1.1101 ; 1.1101101 →1.1110
- 朝-∞方向舍入:舍入为左边最近可表示数 (负向舍入)
- 例:-1.1101101 →-1.1110 ; 1.1101101 →1.1101
- 朝 0 方向舍入:直接截取所需位,后面的位丢弃。这种方法最简单
- 就近舍入:舍入为最近可表示的数
-
如何判断结果溢出(上溢和下溢)。
第四章
指令格式
指令:是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
根据地址码数不同
- 零地址指令:
- 不需要操作数,如停机、关中断等
- 堆栈计算机,操作数隐藏在栈顶
- 一地址指令:
- 只需单操作数,如加一、取反
- 需两个操作数,但其中一个存储在某个寄存器内
- 二地址指令:
- 用于需要两个操作数的算术运算
- 三地址指令:
- 多一个地址存储结果
- 四地址指令:
- 再多一个地址存储下一个指令地址
指令位数不变时,地址码数越多,寻址能力越差
按指令长度分类
指令字长:一条指令的总长度(可能会变)
影响取指令所需时间
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
按操作码长度分类
定长:译码电路设计简单,但复杂性低
按操作类型分类
-
数据传送
-
LOAD:把存储器中的数据放到寄存器中
-
STORE: 把寄存器中的数据放到存储器中
-
-
算数逻辑操作
- 算数、逻辑(与或非、位操作)
-
移位操作
- 算数、逻辑、循环移位
-
转移操作(改变程序执行流,PC指针改变)
-
无条件转移 JMP
-
条件转移JZ:结果为0;JO:结果溢出;JC:结果有进位
-
调用和返回 CALL和RETURN
-
陷阱(Trap)与陷阱指令
-
-
输入输出操作
- CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)
设计
- 指令格式的选择应遵循的几条基本原则
- 应尽量短
- 要有足够的操作码位数
- 指令编码必须有唯一的解释,否则是不合法的指令
- 指令字长应是字节的整数倍
- 合理地选择地址字段的个数
- 指令尽量规整
- 一条指令必须明显或隐含包含以下信息:
- 操作码:指定操作类型
- 源操作数或其地址:一个或多个源操作数所在的地址
- 结果的地址:产生的结果存放何处(目的操作数)
- 下一条指令地址:下条指令存放何处
- 指令的寻址方式—-简单
- 顺序执行:PC增值
- 跳转 ( jump / branch / call / return ):同操作数寻址
- 操作数的寻址方式—-复杂
- 操作数来源:寄存器 / 主(虚)存 /外设端口 / 栈顶
- 操作数结构:位 / 字节 / 半字 / 字 / 双字 / 一维表 / 二维表 /…
- 通常寻址方式特指“操作数的寻址”
扩展操作码
格式:定长指令字结构 + 可边长操作码
- 即不同地址数的指令使用不同的操作码,便于判断
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用 频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和 分析的时间。

设地址长度为n,上一层留出m种状态,下一层可扩展出mx2^n种状态
注意短的操作码不能是长操作码的前缀
寻址方式
PC:程序计数器,取址后会自动加一
指令寻址
确定下一条指令的存放地址,由 PC 指明
顺序寻址:
- PC + ”1“
- 1 理解为一个指令字长,根据指令字长变化字节编码
跳跃寻址
- 执行转移指令导致 PC 值改变(直接修改)
数据寻址
确定本条指令的地址码指明的真实地址
程序存储位置是相对的,需要用偏移量解读
在地址码中划分出寻址特征,规定该地址需要用何种方式寻址
-
直接寻址:存储 = 真实,即 EA = A
-
间接寻址:存储的是真实值的地址,即 EA = (A)
-
寄存器寻址:指令字中直接给出操作数所在寄存器编号
-
寄存器间接寻址:寄存器存储的是操作数所在储存单元的地址,即 EA = (R)
-
隐含寻址:非显示给出的操作数
-
立即寻址:地址就是操作数本身,又称立即数
-
基址寻址:以程序的起始存放地址作为起点,EA = (BR)+ A
BR 为基址寄存器,由操作系统决定,不可更改
- 变址寻址:程序员自己决定从哪里作为起点,EA = (IX)+ A
IX 为变址寄存器,可由用户决定。类似一个指针,设置为数组首地址等
-
相对寻址:程序计数器PC所指地址作为起点,EA = (PC)+ A
-
堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈可以用寄存器实现(硬堆栈)或主存实现,硬堆栈不妨存,速度快
优缺点

条件测试方式(?)

对于带符号数和无符号数运算,标志生成方式有没有不同?
答:没有,因为加法电路不知道是无符号数还是带符号整数!
指令系统设计风格
- 累加器型: (earliest machines)
- 特点:其中一个操作数(源操作数 1)和目的操作数总在累加器中
- 堆栈型: (e.g. HP calculator, Java virtual machines)
- 特点:总是将栈顶两个操作数进行运算,指令无需指定操作数地址
- 通用寄存器型: (e.g. IA-32, Motorola 68xxx)
- 特点:操作数可以是寄存器或存储器数据(即 A、B 和 C 可以是寄存器或存储单元)
- 装入/存储型: (e.g. SPARC, MIPS, PowerPC)
- 特点:运算指令的操作数只能是寄存器数据,只有 load/store 能访问存储器
指令集:CISC 和 RISC
CISC(Complex Instruction Set Computer):
- 一条指令完成一个复杂的基本功能。
- x86 架构
RISC(Reduced Instruction Set Computer):
-
一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能。
-
电路简单,功耗小,寄存器多
-
只有 LOAD、STORE 指令可以访存
-
ARM 架构,主要用于手机、平板
在程序中各种指令出现的频率悬殊很大,最常使用的是一些简单指令,这些指令占程序的80%,但只占指令系统的20%。而且在微程序控制的计算机中,占指令总数20%的复杂指令占用了控制存储器容量的80%。

MIPS 的指令格式
所有指令都是32位宽(字长),按字地址对齐存储,字地址为4的倍数
分为 R、I、J 型
R 型

- 参与运算的操作数和结果都在寄存器,R 型指令的寻址方式只有寄存器寻址一种;
- R 型指令的 op 全为 0,具体功能由 func 部分确定;
- rs:第一个源操作数(source register)
- rt:第 2 个源操作数(target register)
- rd:目的寄存器(destination register)
- shamt:对非移位指令为 00000。移位指令为移位次数。
I 型

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

- op:确定指令的功能
- address:转移地址
整合
- 三种指令 汇编格式 a=b op c 把=和op变成逗号
- R型指令格式是op+rs+rt+rd+shamt+func 汇编格式是 xxx $rs, $rt, $rd
- I型指令格式是op+rs+rt+imm 汇编格式是 xxx $rt, $rs, imm
- J型指令格式是op+addr 汇编格式是 xxx addr
MIPS 的通用寄存器
- 0 号寄存器$zero 为固定值零,不能改变
- MIPS还提供了32个32位的单精度浮点寄存器$f0∽$f31,用于浮点数指令。它们可配对成16个64位的双精度浮点寄存器。
- 在汇编语言中使用寄存器时可以用寄存器名,也可以用寄存器号,前面加上“$”,例如,$8或$t0。
- 寄存器
- 长度:32 位
- 个数:32 个
MIPS 的寻址方式
- 寄存器寻址
- 可以出现在 R 型和 I 型格式中

- 立即数寻址

- 偏移寻址

- PC 相对寻址
- PC<– PC+4+imm*4

- 伪直接寻址
- 为什么称伪直接?
- 最终地址:PC 高四位+addr+两个 0,+表示拼接
- 位数:4+26+2=32

机器语言的解码(反汇编)?
高级语言、汇编语言、机器语言之间的转换 ?
RISC-V 指令系统
具有模块化结构,稳定性和可扩展性好,在简洁性、实现成本、功耗、性能和程序代码量等各方面具有显著优势。
模块化结构:
- 核心:RV32I + 标准扩展集:RV32M、RV32F、RV32D、RV32A = RV32G
- 32位架构RV32G = RV32IMAFD,其压缩指令集RV32C(指令长度16位)
- 64位架构RV64G = RV64IMAFD,其压缩指令集RV64C(指令长度16位)
- 向量计算RV32V和RV64V;嵌入式RV32E(RV32I的子集,16个通用寄存器)
指令格式
32位
R-型为寄存器操作数指令
I-型为短立即数或装入(Load)指令
S-型为存储(Store)指令
B-型为条件跳转指令
U-型为长立即数操作指令
J-型为无条件跳转指令

16位压缩

第五章 中央处理器
CPU 的功能和基本结构
CPU 基本功能:
- 指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
- 操作控制。一条指令的功能往往是由若干操作信号的组合来实现的。CPU 管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件从而控制这些部件按指令的要求进行动作。
- 时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
- 数据加工。对数据进行算术和逻辑运算。
- 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。
基本结构
数据通路 + 控制器

- 控制器
- 对指令进行译码,生成指令对应的控制信号,控制数据通路的动作。它向执行部件发出控制信号,是指令的控制部件。
数据通路
由操作元件和存储元件通过总线方式或分散方式连接而成的进行数据传送、处理和存储的路径。
-
数据通路
-
指令执行过程中,数据所经过的路径,以及路径上的部件。
-
包括:ALU、通用寄存器、状态寄存器、MMU、cache、中断处理逻辑等
-
数据通路中专门进行数据运算的部件称为执行部件或功能部件
-
功能:进行数据传送、处理和存储
-
-
组成元件
- 组合逻辑元件(操作元件):输出只取决于当前输入
- 时序逻辑元件(也称状态元件,或存储元件):在时钟控制下输入被写到电路中,直到下个时钟到达。
- 定时方式:规定信号何时写入状态元件(上升沿、下降沿、电平触发)
- 存储元件:寄存器 –> 寄存器组
-
连接方式
- 总线、分散
时序控制(过去式):
- 现代时钟周期
- …… + 状态元件 + 操作元件( 组合电路) + 状态元件 + ……
- 只有状态元件能存储信息,所有操作元件都从状态元件接收输入,并将输出写入状态元件中。
- 时钟周期=
Latch Prop + Longest Delay Path + Setup + Clock Skew(时钟偏移) - 约束条件:操作元件输出有效信号最快出现必须在下一级状态元件的输入保持时间之后出现
- …… + 状态元件 + 操作元件( 组合电路) + 状态元件 + ……
单周期 MIPS 处理器的设计
复习:三种指令类型 R、I、J
- 设计处理器步骤
- 分析每条指令功能,并用 RTL(Register Transfer Language)来表示
- 根据指令的功能给出所需的元件,并考虑如何将他们互连
- 确定每个元件所需控制信号的取值
- 汇总所有指令所涉及到的控制信号,生成一张反映指令与控制信 号之间关系的表
- 根据表得到每个控制信号的逻辑表达式,据此设计控制器电路
设计数据通路
- R-type:取指 –> 取寄存器 –> 运算 –> 输出、计算下地址
M[PC]从PC所指的内存单元中取指令R[rd] ← R[rs] + R[rt]从rs、r所指的寄存器中取数后相加。若结果不溢出,则将结果送rd所指的寄存器中;若结果溢出,则不送结果,并转到“溢出处理程序”执行。PC ← PC + 4PC加4,使PC指向下一条指令

- I-type
M[PC]取指令(公共操作,取指部件完成)R[rt] ← R[rs] or ZeroExt(imm16)立即数零扩展,并与rs内容做“或”运算PC ← PC + 4计算下地址(公共操作,取指部件完成)

- Lw 装入指令
M[PC]取指令(公共操作,取指部件完成)Addr ← R[rs] + SignExt(imm16)计算存储单元地址 (立即数符号扩展!)R[rt] ← M [Addr]装入数据到寄存器rt中PC ← PC + 4计算下地址(公共操作,取指部件完成)

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

- 分支指令
M[PC]取指令(公共操作,取指部件完成)Cond ← R[rs] - R[rt]做减法比较rs和rt中的内容if (Cond eq 0)计算下地址(根据比较结果,修改PC)PC ← PC + 4 + ( SignExt(imm16) x 4 )
elsePC ← PC + 4

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

- 完成

- 时间计算

设计控制器
- 方法:
- 根据每条指令的功能,分析控制信号的取值,并列表表示。
- 根据列出的指令和控制信号的关系,写出每个控制信号的逻辑表达式。
PPT 上看指令译码后条件码的产生、执行过程,内容较多
- 设计逻辑
- MIPS指令格式中指示操作性质有op 和 func两个字段,分别用来产生两类不同的控制信号
- func只用于R型指令,形成对应的ALU的功能控制信号
- op用来产生各种控制信号,包括了非R型指令的ALU功能控制信号
- 控制器 = 主控制单元 + ALU局部控制单元

- 单周期处理器的性能
- CPI = 1;其他条件一定的情况下,CPI越小,则性能越好!
- 除CPI外,还取决于时钟周期的宽度,单周期处理器的时钟宽度为最复杂指令的执行时间
- 但是,对每类指令采用可变长时钟周期实现非常困难,而且所带来的额外开销会很大,不合算
- 单周期处理器的问题
- 时钟周期以最复杂指令所需时间为准,太长
- 解决思路
- 把指令的执行分成多个阶段,每个阶段用一个时钟周期完成
- 多周期处理器
- 时钟周期短
- 不同指令所用周期数可以不同
- 允许功能部件在一条指令执行过程中被多次使用

微程序设计和异常处理
-
硬连线控制器的特点
-
优点:速度快,适合于简单或规整的指令系统,例如 MIPS 指令集
-
缺点:它是一个多输入/多输出的巨大逻辑网络。对于复杂指令系统来说,结构庞杂,不用大规模集成电路则实现困难;修改、维护不易;灵活性差。
-
简化方法:微程序设计
-
-
微程序控制器
- 仿照程序设计的方法,编制每条指令对应的微程序
- 所有指令对应的微程序放在只读存储器(控制存储器)中,执行某条指令就是取出对应微程序中的各条微指令,对微指令译码产生对应的微命令(即控制信号)
- 特点:具有规整性、可维护性和灵活性,但速度慢
-
基本结构

-
微指令格式
-
水平型:相容微命令尽量多地安排在一条微指令中
- 优点:微程序短,并行性高,适合于较高速度的场合
- 缺点:微指令长,编码空间利用率较低,并且编制困难
-
垂直型:一条微指令只控制一、二个微命令
-
包含:若干微命令、下条微指令地址(可选)、常数(可选)
-

-
异常和中断的处理
-
中断
- 内部异常:在CPU内部发生的意外事件或特殊事件
- 故障(fault):执行指令引起的异常事件,如溢出、缺页、堆栈溢出、访问超时等
- 自陷(Trap):预先安排的事件,如单步跟踪、系统调用(执行访管指令)等
- 终止(Abort):硬故障事件,此时机器将“终止”,调出中断服务程序来重启操作系统
- 外部中断:在CPU外部发生的特殊事件,通过向CPU发“中断请求”信号,请求CPU处理
- 内部异常:在CPU内部发生的意外事件或特殊事件
-
处理机制
- 关中断(“中断/异常允许”状态位清0):使处理器处于“禁止中断”状态,以防止新异常(或中断)破坏断点、程序状态和现场(现场指通用寄存器的值)。
- 保护断点和程序状态:将断点和程序状态保存到堆栈或特殊寄存器中。
- 识别异常事件:有软件识别和硬件识别(向量中断方式)两种不同的方式。
- 软件识别(MIPS采用):设置一个异常状态寄存器(MIPS中为Cause寄存器),用于记录异常原因。操作系统中有一个统一的异常处理程序,该程序按优先级顺序查询异常状态寄存器的各位,识别出异常事件
- 硬件识别(向量中断):用专门的硬件查询电路按优先级顺序识别异常,得到“中断类型号”
-
MIPS 异常处理数据通路设计
- 增加以下两个寄存器
- EPC:32位,用于存放断点(异常处理后返回到的指令的地址)
- Cause:32位,记录异常原因
- 增加两个寄存器的“写使能”控制信号
- EPCWr:在保存断点时该信号有效,使断点PC写入EPC
- CauseWr:在处理器发现异常(如:非法指令、溢出)时,该信号有效,使异常类型被写到Cause寄存器
- 需要一个控制信号IntCause来选择正确的值写入到Cause中
- 需要将异常查询程序的入口地址(MIPS为0x8000 0180)写入PC,可以在原来PCSource控制的多路复用器中再增加一路,其输入为0x8000 0180
- 增加以下两个寄存器
必须考虑:保存断点和异常原因,并将控制转到异常处理程序首地址处 =======
title: “计算机组成原理” subtitle: “王道课程笔记” summary: “计算机组成原理课程的笔记” description: “计算机组成原理课程的笔记” date: 2025-10-03 lastmod: 2025-11-06 image: "" draft: false toc: enable: true weight: false categories: [“笔记”] tags: [“笔记”]
第一章 计算机系统概述
计算机系统的发展
计算机系统 = 硬件 + 软件
软件
系统软件:用来管理整个计算机系统
应用软件:按任务需要编制成的程序
硬件
第一台电子数字计算机:ENIAC
-
逻辑元件(用于处理电信号的最小单元):电子管
-
十进制表示,手动编程
-
无冯 · 诺伊曼结构
第二代:晶体管
- 元器件:逻辑元件(晶体管),内存(磁芯),外存(磁鼓,磁带)
- 特点:变址,浮点运算,多路存储器,I/O 处理机,中央交换结构(非总线)。
- 软件:使用高级语言,提供系统软件。
第三代:中小规模集成电路
- 元器件:逻辑元件和主存储器均由集成电路实现。
- 特点:微程序控制,Cache,虚拟存储器,流水线。
- 代表机种:IBM 360(大型机),DEC PDP-8(小型机),巨型机。
IBM 360(兼容机)
相同/相似的指令集&操作系统。
好处: 原来机器上的程序可以不改动而在新机器上运行,但性能不同。
保持兼容的关键:低端机指令集是高端机的一个子集,称为“向后兼容”。
DEC PDP-8(采用总线结构)
总线结构好处:可扩充性好(允许将新的符合标准的模块插入总线,形成各种配置),节省器件,体积小,价格便宜
第四代:大规模、超大规模集成电路
- 半导体存储器,微处理器发展迅速。
- 特点:共享存储器,分布式存储器以及大规模并行系统。
组成
冯诺依曼结构模型
冯诺依曼提出存储程序,取代手动接线。
冯诺依曼结构:
- 计算机由运算器,控制器,存储器,输入设备和输出设备五个基本部件组成。
- 各基本部件功能:
- 存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;
- 控制器应能自动执行指令;
- 运算器应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算;
- 操作人员可以通过输入设备和输出设备与主机进行通信。
- 内部以二进制数表述指令和数据
- 每条指令由操作码和地址码两部分组成。操作码指出操作的类型,地址码指出操作数的地址。
- 由一串指令组成程序。
- 采用存储程序工作方式
- 将事先编好的程序和原始数据送入主存中;启动执行后,在不需操作人员干预下,自动完成逐条取出指令和执行指令的任务。

基本部件及其功能
- 运算器(数据运算):ALU、GPRs、标志寄存器等。
- 存储器(数据存储):存储阵列、地址译码器、读写控制电路
- 总线(数据传送):数据线(MDR)、地址线(MAR)和控制线
- 控制器(控制):对指令译码生成控制信号
CPU = 运算器 + 控制器
主机 = CPU + 主存
各硬件工作原理
主存储器
主存储器 = 存储体 + MAR + MDR
- Memory Address Register 存储地址寄存器:指示位置,位数反应存储单元的个数
- Memory Data Register 存储数据寄存器:指示存入、取出的具体数据(包括指令)
- 存储体:数据、指令在存储体内按地址存储,每个存储单元对应一个地址
1B = 1 byte ; 1 b = 1 bit
MAR、MDR 逻辑上属于主存,但被集成到 CPU
运算器
实现算数运算、逻辑运算
运算器 = ACC + ALU + MQ + X
- Accumulator:累加器,存放操作数或运算结果
- Multiple-Quotient Register:乘商寄存器,乘除运算时,存放操作数或运算结果
- Arithmetic and Logic Unit:算数逻辑单元,通过复杂电路实现算数运算、逻辑运算
- X:通用的操作数寄存器,用于存放操作数
控制器
控制器 = CU + IR +PC
-
Control Unit:控制单元,分析指令,给出控制信号
-
Instruction Register:指令寄存器,存放当前执行的指令
-
Program Counter:程序计数器,存放下一条指令地址,有自动加1功能
配合

指令和数据
- 程序启动前,指令和数据都存储在存储器中,形式上没有区别,都是 0/1 序列。
- 采用存储程序的工作方式,程序由指令组成,启动后计算机自动取出一条条指令并执行,无需人的干预。
- 指令执行过程中,指令和数据从存储器取到 CPU,指令存在 IR 中,数据在 GPR 中。
- 指令需要给出的信息
- 操作码:指令的操作,加减法等
- 一个或多个源操作数:立即数、寄存器编号、存储地址
- 目的操作数地址:寄存器编号、存储地址
执行过程
- 程序执行前
- 数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放。指令由 OP、ADDR 字段组成,程序起始地址送入 PC。
- 开始执行程序
- 根据 PC 取指令送 IR:PC -> MAR ->存储器 -> MDR -> IR
- 指令译码:IR -> 控制器,控制器译码
- 取操作数:GPRs 或存储器 -> ALU
- 执行指令操作:ALU 运算
- 回写结果到 GPRs 或存储器
- 修改 PC 的值,使其指向下一条指令
- 重复上述步骤直到程序完成
软件
- 系统软件——简化编程,使硬件资源被有效利用
- 操作系统:硬件资源管理,用户接口
- 语言处理程序:翻译程序,Linker,Debug…
- 翻译程序
- 汇编器(Assembler):汇编语言源程序->机器目标程序。或许叫汇编器更好理解?
- 编译器(Complier):高级语言程序->汇编/机器目标程序。或许叫编译器更好理解?
- 解释器(Interpreter):将高级语言程序语句逐条翻译成机器指令并执行,不生成目标文件。(跳过汇编阶段)
- 翻译程序
- 其他实用程序:磁盘碎片整理、备份程序…
机器语言:二进制代码
汇编语言:助记符
高级语言:C、C++、……
- 应用软件——解决具体的应用问题
层次结构
语言层次
- 微指令系统:直接控制硬件执行
- 机器语言:传统机器M1,执行二进制机器指令
-
操作系统机器
-
汇编语言:虚拟机器M2,用汇编语言翻译成机器语言
-
高级语言:虚拟机器M3,需要编译成汇编、机器语言
上两层视为硬件层
计算机体系结构:讨论如何设计硬件与软件之间的接口
计算机组成原理:讨论如何用硬件实现接口

ISA
指令集体系结构,其作为规约,规定了如何使用硬件。
- 可执行的指令集合,包括指令格式、操作种类以及对应操作数的规定。
- 可以接受的操作数类型。
- 操作数存放的寄存器组结构,例如寄存器名称、编号、长度和用途。
- 操作数存放的存储空间的大小和编址方式。
- 操作数在存储空间中按大/小端方式存放。
- 指令获得操作数的方式,即寻址方式。
- 指令执行过程的控制方式,例如程序计数器,条件码定义等。
ISA 是计算机系统中必不可少的抽象层。
性能指标
存储器
总容量 = 存储单元个数 * 存储字长(bit)
CPU
基本概念
-
主频:CPU内数字脉冲信号振荡的频率
-
- = 1 / 时钟周期
-
CPI:执行一条指令需要多少个时钟周期(不同指令,CPI不同)
-
CPU执行时间:执行整个程序的耗时 = (条数 * CPI) / 主频
-
IPS:每秒执行多少个命令 = 主频 / 平均CPI
-
FLOPS:每秒执行多少次浮点运算
K=Kilo=千=10^3
M=Million=百万=10^6
G=Giga=十亿=10^9
T=Tera=万亿=10^12
-
数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)
-
吞吐量:单位时间内处理请求的数量
-
相应时间:CPU时间 + 等待时间
-
基准程序:用于测量的程序
MIPS(Million Instructions Per Second):每秒执行多少百万条指令,着重点在于单条指令。
MIPS 为平均值,其并没有考虑以上三个属性,并且由于:
- 不同机器指令集不同
- 程序由不同指令混合而成
- 指令的频率会动态变换
- 厂家给出峰值 MIPS
因此,MIPS 表示性能存在局限性。
MFLOPS:每秒执行浮点运算多少百万次,着重在于浮点操作本身。
计算
CPU 执行时间=CPI×程序总指令条数×时钟周期

第二章 数据的机器级表示
信息二进制编码
计算机内部数据:二进制表示
机器级数据:
- 数值数据,无符号/带符号整数,浮点数,十进制数
- 非数值数据,逻辑数,汉字
二进制编码原因:
- 制造两个稳态的物理器件容易
- 二进制编码、计数、运算规则简单。
- 与逻辑命题对应,便于逻辑运算,方便地用逻辑电路实现算术运算。
机器数:0/1 编码的 0/1 内部 0/1 序列。
真值:机器数真正的值
数值数据表示方法
三要素:
- 进位计数制:十进制,二进制等转换。
- 定点浮点表示:定点整数/小数;浮点数(使用一个定点小数和一个定点整数表示)
- 编码:原码补码反码等。
若不知道三要素,那么便无法得知机器数的具体真值。
进制转换:
- 二进制 -> 其他:划分位数,对应
- 十六、八 -> 二:位数对应,补全
- 十进制 -> 任意位数:求商取余
定点数的表示
常规计数,小数点位置固定。整数、小数分开存储。
-
无符号数:没有符号位
-
原码:
- 有 +0、-0 两种表示形式
-
反码:
- 正数与原码相同
- 若符号位为1,则数值位全部取反
- 依然有 +0、-0
-
补码:
- 将减法抓换为等价的加法(加上补数)
- = 原码除符号位外,取反后加一(即反码 + 1)
-
移码: 将每一个数值加上一个偏置常数( bias)
-
一般来说,当编码位数为 n **时,bias 取 2^n 标准移码
-
为什么要用移码来表示阶码?
-
便于浮点数加减运算时的对阶操作(比较大小)
-
与补码的关系:最高位相反,其余位相同
-
C语言的解析
无符号数变为有符号:不改变数据内容,改变解释方式
长变短:高位截断,保留地位
短变长:符号扩展
- 负数补1,正数补0
IEEE编码
规定了二进制浮点数算数标准,类似科学计数法简化计数
二进制浮点数
-
符号:决定数值的正负性
-
尾数:影响数值的精度。尾数的位数越多,精度越高
-
阶码:反映小数点的实际位置
-
基数:K进制通常默认基数为K
-
规格化:石确保尾数的最高位非0数位刚好在小数点之前
float型:32位单精度
- 符号 + 阶码 + 尾数:1 + 8 + 23
double型:64位双精度
- 符号 + 阶码 + 尾数:1 + 11 + 52
float单精度
-
默认存储规格化尾数,小数点前的1省略(隐含)
-
基数规定为 2
-
阶码用移码表示,规定偏置值为 127
如何将十进制真值转换为偏置值为M的移码?
将十进制真值+偏置值
按“无符号整数”规则转换为指定位数
double双精度
- 偏置值为1023
表示范围
特殊状态
阶码全 0,或阶码全 1
- 阶码真值的取值范围为 -126 ~ 127(单精度)

根据数轴,存在:
- 正上溢、正下溢、负上溢,负下移
- 上溢置为无穷,下溢置为0

数据表示
十进制数表示
-
ASCII 码:就是把数字当作字符存储,0-9用30H-39H表示
- 前分隔:正号用 2B 负号用 2D 放在最前面
- 后嵌入:将符号嵌入最低位数字的 ASCII 码高 4 位中。
- 正数不变;负数高 4 位变为 0111。
-
BCD 码
- 每 1 位十进制数用 4 位二进制表示。而 4 位二进制数可组合成 16 种状态,只需要选 10 种状态来表示十进制数。
西文字符表示:
复习要点中未提到
- 十进制数字:0/1/2…/9 10 个
- 英文字母:A/B/…/Z/a/b/…/z 52 个
- 专用符号:+/-/%/*/&/…… 33 个
- 控制字符(不可打印或显示) 33 个
汉字表示
- 输入码:用于输入汉字。
- 内码:用于在系统中进行存储、查找、传送等处理
- 字模点阵或轮廓描述:用于显示/打印
数据的宽度
- bit
- 字节:
- 现代计算机中,存储器按字节编址
- 字节是最小可寻址单位 (addressable unit )
- LSB 表示最低有效字节,MSB 表示最高有效字节
- 字
- 表示被处理信息的单位,用来度量数据类型的宽度
- 字长
- 指某特定机器定点运算时数据通路的宽度。
- 数据通路: CPU 内部进行数据运算、存储和传送的路径以及路径上的部件。
- 等于 CPU 内部总线的宽度,或运算器的位数,或通用寄存器的宽度。
数据的存储和排列顺序
- 大小端
- 小端( Little Endian):低字节放低地址
- 大端( Big Endian):高字节放低地址
- 指令中,操作码和寄存器号的存放顺序不变,只需要考虑立即数的顺序
- 对齐:要求数据存放的地址必须是相应的边界地址
- 每次访存只能读写一个字
- 浪费一定空间,换取存取时间

数据的检错与纠错
大多采用“冗余校验”思想,即除原数据信息外,还增加若干位编码,这些新增的代码被称为校验位。
- 奇偶校验码
- 海明校验码
- 循环冗余校验码
第三章 运算方法和运算部件
加法器
串行进位
传递速度慢
并行进位
-
用先行进位优化,各进位之间无等待,相互独立并同时产生
-
但全先行电路复杂,成本高
-
局部先行进位加法器: 组内并行、组间串行
- 用多个位数较少的 n 位全先行进位加法器进行串联
-
多级先行进位加法器: 组内并行、组间并行
ALU的构成
- ALU 如何控制实现加、减、与、或等等各种功能;
- 无符号整数和带符号整数的加、减运算电路完全一样,这个运算电路称为整数加/减运算部件。
- 在整数加/减运算部件基础上,加上寄存器、移位器以及控制逻辑,就可实现 ALU、乘/除运算以及浮点运算。
- ALU 的 OF、SF、CF 和 ZF 标志信息如何产生。
- 零标志 ZF、溢出标志 OF、进/借位标志 CF、符号标志 SF 称为条件标志。
- 条件标志(Flag)在运算电路中产生,被记录到专门的寄存器中
- 存放标志的寄存器通常称为程序/状态字寄存器或标志寄存器。

溢出条件:
- 无符号加、减溢出条件:CF=1
- 带符号加、减溢出条件:OF=1
定点数运算
移位
逻辑移位
-
针对无符号数
-
左移 n 位,即乘上位权的 n 次方。
-
高位溢出丢弃,低位补 0
算数移位
- 左移与逻辑移位类似,但移到符号位结果更改
- 右移:低位移出丢弃,但高位补符号位,若移出 1,则发生精度丢失
加减
原码
- 减法用减法器实现,1 变 0
补码
- 符号位可以一起参与运算
- [A+B]补=[A]补+ [B]补
- [A-B]补=[A]补+[-B]补
[-B] 补 = [B] 补的 “取反加 1”,符号位也参与取反
- 溢出判断:上溢正变负;只有可能同号运算出现;判断是否在合法表示范围内即可
乘法
无符号整数:
- 模拟手算乘法即可,计算机还需拆分部分积
具体实现:

带符号整数
给无符号整数乘法电路添加一辅助位,让符号位参与运算。
计算机底层判断溢出:
- 若 2n 位的高 n + 1 位不均相同,则溢出
实现方式
- ALU + 移位器 + 寄存器 + 控制逻辑
- 阵列乘法器
- 逻辑运算模拟
浮点数运算
-
浮点数加减运算的对阶原则和方法;
-
原则:小阶向大阶看齐
-
方法:阶小的那个数的尾数右移,右移位数等于两个阶码差的绝对值
-
IEEE 754 尾数右移时,要将隐含的“1”移到小数部分,高位补 0,移出的低位保留到特定的“附加位”上
-
-
如何计算移码表示的阶码的和与差(标准移码与 IEEE754 移码有什么差别);
-
阶码加法公式为: Eb ← Ex + Ey + 129 ( mod 2^8)
-
阶码减法公式为: Eb ← Ex + [–Ey]补 + 127 ( mod 2^8)
-
-
如何计算一个移码数减 1
-
尾数规格化中的右规和左规方法;
- 当尾数高位为 0,则需左规:尾数左移一次,阶码减 1,直到 MSB 为 1
- 每次阶码减 1 后要判断阶码是否下溢
- 先判断阶码是否为全 0,若是,则直接置阶码下溢;否则,阶码减 1 后判断阶码是否为全 0,若是,则阶码下溢。
- 当尾数最高位有进位,需右规:尾数右移一位,阶码加 1,直到 MSB 为 1
- 每次阶码加 1 后要判断阶码是否上溢
- 先判断阶码是否为全 1,若是,则直接置阶码上溢;否则,阶码加 1 后判断阶码是否为全 1,若是,则阶码上溢。
- 阶码溢出异常处理:
- 阶码上溢,则结果溢出;
- 阶码下溢,则结果为 0
- 乘法运算结果不需左规!最多右规 1 次!
- 除法最多左规 1 次!不需右规!
- 当尾数高位为 0,则需左规:尾数左移一次,阶码减 1,直到 MSB 为 1
-
尾数的舍入处理常用方法;
- 就近舍入:舍入为最近可表示的数
- 若为非中间值:LSB 后 1 位 0 舍 1 入
- 若为中间值:强迫结果为偶数, LSB=
- 1.1101110 → 1.1110 (1.1101110 → 1.1110, 110>100, 1.1101+0.0001 = 1.1110)
- 1.1101011 → 1.1101 (1.1101011 → 1.1101, 011<100, 1.1101+ 0 = 1.1101)
- 1.1101101 → 1.1110
- 1.1111100 → 10.0000 (1.1111100 → 10.0000, 100=100, 1.1111+0.0001 = 10.0000)
- 朝+∞方向舍入:舍入为右边最近可表示数 (正向舍入)
- 例:-1.1101101 →-1.1101 ; 1.1101101 →1.1110
- 朝-∞方向舍入:舍入为左边最近可表示数 (负向舍入)
- 例:-1.1101101 →-1.1110 ; 1.1101101 →1.1101
- 朝 0 方向舍入:直接截取所需位,后面的位丢弃。这种方法最简单
- 就近舍入:舍入为最近可表示的数
-
如何判断结果溢出(上溢和下溢)。
第四章
指令格式
指令:是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
根据地址码数不同
- 零地址指令:
- 不需要操作数,如停机、关中断等
- 堆栈计算机,操作数隐藏在栈顶
- 一地址指令:
- 只需单操作数,如加一、取反
- 需两个操作数,但其中一个存储在某个寄存器内
- 二地址指令:
- 用于需要两个操作数的算术运算
- 三地址指令:
- 多一个地址存储结果
- 四地址指令:
- 再多一个地址存储下一个指令地址
指令位数不变时,地址码数越多,寻址能力越差
按指令长度分类
指令字长:一条指令的总长度(可能会变)
影响取指令所需时间
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
按操作码长度分类
定长:译码电路设计简单,但复杂性低
按操作类型分类
-
数据传送
-
LOAD:把存储器中的数据放到寄存器中
-
STORE: 把寄存器中的数据放到存储器中
-
-
算数逻辑操作
- 算数、逻辑(与或非、位操作)
-
移位操作
- 算数、逻辑、循环移位
-
转移操作(改变程序执行流,PC指针改变)
-
无条件转移 JMP
-
条件转移JZ:结果为0;JO:结果溢出;JC:结果有进位
-
调用和返回 CALL和RETURN
-
陷阱(Trap)与陷阱指令
-
-
输入输出操作
- CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)
设计
- 指令格式的选择应遵循的几条基本原则
- 应尽量短
- 要有足够的操作码位数
- 指令编码必须有唯一的解释,否则是不合法的指令
- 指令字长应是字节的整数倍
- 合理地选择地址字段的个数
- 指令尽量规整
- 一条指令必须明显或隐含包含以下信息:
- 操作码:指定操作类型
- 源操作数或其地址:一个或多个源操作数所在的地址
- 结果的地址:产生的结果存放何处(目的操作数)
- 下一条指令地址:下条指令存放何处
- 指令的寻址方式—-简单
- 顺序执行:PC增值
- 跳转 ( jump / branch / call / return ):同操作数寻址
- 操作数的寻址方式—-复杂
- 操作数来源:寄存器 / 主(虚)存 /外设端口 / 栈顶
- 操作数结构:位 / 字节 / 半字 / 字 / 双字 / 一维表 / 二维表 /…
- 通常寻址方式特指“操作数的寻址”
扩展操作码
格式:定长指令字结构 + 可边长操作码
- 即不同地址数的指令使用不同的操作码,便于判断
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用 频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和 分析的时间。

设地址长度为n,上一层留出m种状态,下一层可扩展出mx2^n种状态
注意短的操作码不能是长操作码的前缀
寻址方式
PC:程序计数器,取址后会自动加一
指令寻址
确定下一条指令的存放地址,由 PC 指明
顺序寻址:
- PC + ”1“
- 1 理解为一个指令字长,根据指令字长变化字节编码
跳跃寻址
- 执行转移指令导致 PC 值改变(直接修改)
数据寻址
确定本条指令的地址码指明的真实地址
程序存储位置是相对的,需要用偏移量解读
在地址码中划分出寻址特征,规定该地址需要用何种方式寻址
-
直接寻址:存储 = 真实,即 EA = A
-
间接寻址:存储的是真实值的地址,即 EA = (A)
-
寄存器寻址:指令字中直接给出操作数所在寄存器编号
-
寄存器间接寻址:寄存器存储的是操作数所在储存单元的地址,即 EA = (R)
-
隐含寻址:非显示给出的操作数
-
立即寻址:地址就是操作数本身,又称立即数
-
基址寻址:以程序的起始存放地址作为起点,EA = (BR)+ A
BR 为基址寄存器,由操作系统决定,不可更改
- 变址寻址:程序员自己决定从哪里作为起点,EA = (IX)+ A
IX 为变址寄存器,可由用户决定。类似一个指针,设置为数组首地址等
-
相对寻址:程序计数器PC所指地址作为起点,EA = (PC)+ A
-
堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈可以用寄存器实现(硬堆栈)或主存实现,硬堆栈不妨存,速度快
优缺点

条件测试方式(?)

对于带符号数和无符号数运算,标志生成方式有没有不同?
答:没有,因为加法电路不知道是无符号数还是带符号整数!
指令系统设计风格
- 累加器型: (earliest machines)
- 特点:其中一个操作数(源操作数 1)和目的操作数总在累加器中
- 堆栈型: (e.g. HP calculator, Java virtual machines)
- 特点:总是将栈顶两个操作数进行运算,指令无需指定操作数地址
- 通用寄存器型: (e.g. IA-32, Motorola 68xxx)
- 特点:操作数可以是寄存器或存储器数据(即 A、B 和 C 可以是寄存器或存储单元)
- 装入/存储型: (e.g. SPARC, MIPS, PowerPC)
- 特点:运算指令的操作数只能是寄存器数据,只有 load/store 能访问存储器
指令集:CISC 和 RISC
CISC(Complex Instruction Set Computer):
- 一条指令完成一个复杂的基本功能。
- x86 架构
RISC(Reduced Instruction Set Computer):
-
一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能。
-
电路简单,功耗小,寄存器多
-
只有 LOAD、STORE 指令可以访存
-
ARM 架构,主要用于手机、平板
在程序中各种指令出现的频率悬殊很大,最常使用的是一些简单指令,这些指令占程序的80%,但只占指令系统的20%。而且在微程序控制的计算机中,占指令总数20%的复杂指令占用了控制存储器容量的80%。

MIPS 的指令格式
所有指令都是32位宽(字长),按字地址对齐存储,字地址为4的倍数
分为 R、I、J 型
R 型

- 参与运算的操作数和结果都在寄存器,R 型指令的寻址方式只有寄存器寻址一种;
- R 型指令的 op 全为 0,具体功能由 func 部分确定;
- rs:第一个源操作数(source register)
- rt:第 2 个源操作数(target register)
- rd:目的寄存器(destination register)
- shamt:对非移位指令为 00000。移位指令为移位次数。
I 型

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

- op:确定指令的功能
- address:转移地址
整合
- 三种指令 汇编格式 a=b op c 把=和op变成逗号
- R型指令格式是op+rs+rt+rd+shamt+func 汇编格式是 xxx $rs, $rt, $rd
- I型指令格式是op+rs+rt+imm 汇编格式是 xxx $rt, $rs, imm
- J型指令格式是op+addr 汇编格式是 xxx addr
MIPS 的通用寄存器
- 0 号寄存器$zero 为固定值零,不能改变
- MIPS还提供了32个32位的单精度浮点寄存器$f0∽$f31,用于浮点数指令。它们可配对成16个64位的双精度浮点寄存器。
- 在汇编语言中使用寄存器时可以用寄存器名,也可以用寄存器号,前面加上“$”,例如,$8或$t0。
- 寄存器
- 长度:32 位
- 个数:32 个
MIPS 的寻址方式
- 寄存器寻址
- 可以出现在 R 型和 I 型格式中

- 立即数寻址

- 偏移寻址

- PC 相对寻址
- PC<– PC+4+imm*4

- 伪直接寻址
- 为什么称伪直接?
- 最终地址:PC 高四位+addr+两个 0,+表示拼接
- 位数:4+26+2=32

机器语言的解码(反汇编)?
高级语言、汇编语言、机器语言之间的转换 ?
RISC-V 指令系统
具有模块化结构,稳定性和可扩展性好,在简洁性、实现成本、功耗、性能和程序代码量等各方面具有显著优势。
模块化结构:
- 核心:RV32I + 标准扩展集:RV32M、RV32F、RV32D、RV32A = RV32G
- 32位架构RV32G = RV32IMAFD,其压缩指令集RV32C(指令长度16位)
- 64位架构RV64G = RV64IMAFD,其压缩指令集RV64C(指令长度16位)
- 向量计算RV32V和RV64V;嵌入式RV32E(RV32I的子集,16个通用寄存器)
指令格式
32位
R-型为寄存器操作数指令
I-型为短立即数或装入(Load)指令
S-型为存储(Store)指令
B-型为条件跳转指令
U-型为长立即数操作指令
J-型为无条件跳转指令

16位压缩

第五章 中央处理器
CPU 的功能和基本结构
CPU 基本功能:
- 指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
- 操作控制。一条指令的功能往往是由若干操作信号的组合来实现的。CPU 管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件从而控制这些部件按指令的要求进行动作。
- 时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
- 数据加工。对数据进行算术和逻辑运算。
- 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。
基本结构
数据通路 + 控制器

- 控制器
- 对指令进行译码,生成指令对应的控制信号,控制数据通路的动作。它向执行部件发出控制信号,是指令的控制部件。
数据通路
由操作元件和存储元件通过总线方式或分散方式连接而成的进行数据传送、处理和存储的路径。
-
数据通路
-
指令执行过程中,数据所经过的路径,以及路径上的部件。
-
包括:ALU、通用寄存器、状态寄存器、MMU、cache、中断处理逻辑等
-
数据通路中专门进行数据运算的部件称为执行部件或功能部件
-
功能:进行数据传送、处理和存储
-
-
组成元件
- 组合逻辑元件(操作元件):输出只取决于当前输入
- 时序逻辑元件(也称状态元件,或存储元件):在时钟控制下输入被写到电路中,直到下个时钟到达。
- 定时方式:规定信号何时写入状态元件(上升沿、下降沿、电平触发)
- 存储元件:寄存器 –> 寄存器组
-
连接方式
- 总线、分散
时序控制(过去式):
- 现代时钟周期
- …… + 状态元件 + 操作元件( 组合电路) + 状态元件 + ……
- 只有状态元件能存储信息,所有操作元件都从状态元件接收输入,并将输出写入状态元件中。
- 时钟周期=
Latch Prop + Longest Delay Path + Setup + Clock Skew(时钟偏移) - 约束条件:操作元件输出有效信号最快出现必须在下一级状态元件的输入保持时间之后出现
- …… + 状态元件 + 操作元件( 组合电路) + 状态元件 + ……
单周期 MIPS 处理器的设计
复习:三种指令类型 R、I、J
- 设计处理器步骤
- 分析每条指令功能,并用 RTL(Register Transfer Language)来表示
- 根据指令的功能给出所需的元件,并考虑如何将他们互连
- 确定每个元件所需控制信号的取值
- 汇总所有指令所涉及到的控制信号,生成一张反映指令与控制信 号之间关系的表
- 根据表得到每个控制信号的逻辑表达式,据此设计控制器电路
设计数据通路
- R-type:取指 –> 取寄存器 –> 运算 –> 输出、计算下地址
M[PC]从PC所指的内存单元中取指令R[rd] ← R[rs] + R[rt]从rs、r所指的寄存器中取数后相加。若结果不溢出,则将结果送rd所指的寄存器中;若结果溢出,则不送结果,并转到“溢出处理程序”执行。PC ← PC + 4PC加4,使PC指向下一条指令

- I-type
M[PC]取指令(公共操作,取指部件完成)R[rt] ← R[rs] or ZeroExt(imm16)立即数零扩展,并与rs内容做“或”运算PC ← PC + 4计算下地址(公共操作,取指部件完成)

- Lw 装入指令
M[PC]取指令(公共操作,取指部件完成)Addr ← R[rs] + SignExt(imm16)计算存储单元地址 (立即数符号扩展!)R[rt] ← M [Addr]装入数据到寄存器rt中PC ← PC + 4计算下地址(公共操作,取指部件完成)

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

- 分支指令
M[PC]取指令(公共操作,取指部件完成)Cond ← R[rs] - R[rt]做减法比较rs和rt中的内容if (Cond eq 0)计算下地址(根据比较结果,修改PC)PC ← PC + 4 + ( SignExt(imm16) x 4 )
elsePC ← PC + 4

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

- 完成

- 时间计算

设计控制器
- 方法:
- 根据每条指令的功能,分析控制信号的取值,并列表表示。
- 根据列出的指令和控制信号的关系,写出每个控制信号的逻辑表达式。





