第三章 CPU子系统#
目录#
1. 概述#
1.1. CPU 的结构#
1.1.1. 运算器#
ALU(Arithmetic Logic Unit) 算术逻辑运算部件是运算部件的核心。
1.1.2. 寄存器组#
- 通用寄存器组,有编号,可编程访问。
- 暂存器,无编号,不可编程访问,在 CPU 工作时内部专用。
- 指令寄存器(IR,Instruction Register),用来存放当前正在执行的指令,它的输出包括操作码信息,地址信息等,是产生微命令的主要逻辑依据。
- 程序计数器(PC,Program Counter),也称为指令计数器或指令指针,用来指示指令在存储器中的存放位置。当程序顺序执行时,每次从主存取出一条指令,PC内容就增量计数,指向下一条指令的地址。
- 程序状态字寄存器(PSW,Program Status Words),用来记录现行程序的运行状态和指示程序的工作方式。PC、IR、PSW 等寄存器属于控制部件,用来存放控制信息。
- 地址寄存器(MAR,Memory Address Register),存放要被 CPU 访问的存储单元的地址。
- 数据缓冲寄存器(MDR,Memory Data Register),用来存放 CPU 与主存之间交换的数据。
MAR 和 MDR 是连接 CPU 与主存的桥梁,设置这两个寄存器使 CPU 与主存之间的传输通路变得比较单一,容易控制。这两个寄存器不能直接编程访问,对用户是透明的。
1.1.3. 控制器#
控制部件的功能只要是负责对指令进行译码,并且发出为完成每条指令所要执行的各操作的控制信号。
1.1.4. 时序系统#
产生时间信号。
1.1.5. CPU内部的数据通路#
- 单组内总线,分立寄存器结构
- 单组内总线,集成寄存器结构
- 多组内总线结构
1.2. CPU的工作原理#
1.2.1. 主要功能#
- 处理指令
- 执行操作
- 控制时间
- 处理数据
1.2.2. 工作阶段#
- 取指令
- 指令译码
- 指令执行
- 后续阶段
1.3. CPU的指令集类型#
1.3.1. CISC#
CISC (Complex Instruction Set Computer),复杂指令集计算机。
指令系统庞大,指令功能复杂,指令格式多变,寻址方式也很多。难以用优化编译计数生成高效的目标代码。
1.3.2. RISC#
RISC (Reduced Instruction Set Computer),精简指令集计算机。
指令更加精简,指令格式更统一,指令种类也更少甚至寻址方式更简单,而且采用了超标量和超流水线结构,大大增加了CPU的并行处理能力,处理速度提高了很多。
1.4. 模型机的组成#
2. 指令系统#
2.1. 指令格式#
2.1.1. 指令中的基本信息#
- 操作码
- 操作数或操作数的地址
- 存放运算结果的地址
- 后继指令地址,多以隐含方式给出
大部分指令的基本格式为操作码 加上地址码 。
2.1.2. 指令中的地址结构#
2.1.2.1. 三地址指令
指令格式
指令功能
2.1.2.2. 二地址指令
指令格式
指令功能
2.1.2.3. 一地址指令
指令格式
指令功能
2.1.2.4. 零地址指令
指令格式
有几种情况可能使用零地址。
-
不需要操作数的指令,如空操作指令(如Sleep)和停机指令
-
隐含操作数在累加器 中
指令功能
- 对堆栈栈顶单元中的数据进行操作。由被称为堆栈指针的寄存器 给出栈顶单元地址。
2.1.3. 操作码结构#
2.1.3.1. 固定长度操作码
操作码位数一定且位置固定,因此读取与识别指令都比较方便。
2.1.3.2. 可变长度操作码(扩展操作码)
当指令中的地址部分位数较多时,让操作码的位数少些;当指令的地址部分位数减少时,可让操作码的位数增多,以增加指令种类,这被称为扩展操作码。
约定某种组合为扩展码,如对于一个 位指令,当指令为三地址指令时,三个地址共占 位,操作码 位。当操作码为 时,可分别表示 条三地址指令,留下 作为扩展码标志,可扩展为二地址、一地址或零地址指令。
2.1.3.3. 单功能型或复合型操作码
单功能型:一个具体的操作码只表示一种操作含义
复合型:一个具体的操作码在参数不同的情况下可以表示不同的含义,如当地址 为 时表示对 进行操作的一地址指令,地址 不为 时表示二地址指令。
2.1.4. 指令字长#
固定字长:在早期计算机中被使用,后逐渐转化为可变字长指令。又因为指令精简在 中被重新使用。
可变字长:将操作码放在指令的第 字节,以此判定是双操作数指令、单操作数指令或是其它,从而决定读取后面的几字节指令代码。
2.2. 寻址方式#
2.2.1. 概述#
所谓寻址,就是指产生操作数的有效地址,因此将产生操作数有效地址的方式称为寻址方式。
指令可能存放的地方有以下几种可能:
- 操作数就包含在该指令之中,或紧跟着该指令。此时需要由指令直接给出操作数。
- 操作数在CPU的某个寄存器之中。此时指令中应给出寄存器号。
- 操作数在主存储器中,指令应以某种方式给出主存单元地址码。
- 操作数在堆栈区中。可以隐含约定由堆栈指针 提供地址。
- 操作数在某个 接口的寄存器之中。
寻址方式可归纳为:
- 立即寻址。在读取指令时就从指令之中获得了操作数。
- 直接寻址类。直接给出主存地址或寄存器号,以读取操作数。
- 间接寻址类。先从某寄存器中或主存中读取地址,再按这个地址访问主存以读取操作数。再使用同一条指令的前提下,使操作数地址可以变化,从而增加编程的灵活性,使一条指令甚至是一段指令可以被重复利用。
- 变址类。指令给出的是形式地址,经过某种计算(如相加、相减、高低位地址拼接等)才能获得有效地址。使程序能更有效地适应各种需要,如对数组、表格、链表等数据结构的访问,以及程序转移、存储管理、程序重定位等。
2.2.2. 常见的寻址方式#
2.2.2.1. 立即寻址
2.2.2.2. 直接寻址
2.2.2.3. 寄存器直接寻址
2.2.2.4. 主存间接寻址
2.2.2.5. 寄存器间接寻址
自增型寄存器间址
自减型寄存器间址
2.2.2.6. 变址寻址
2.2.2.7. 基址寻址
2.2.2.8. 基址加变址寻址
2.2.2.9. 相对寻址
2.2.2.10. 页面寻址
2.2.2.11. 堆栈寻址
2.3. 指令的功能和类型#
2.3.1. 传输类指令#
- 传输指令
- 访存指令
- I/O指令
eg. MOV
2.3.2. 访存指令#
- 加载指令(读存储器)
- 存储指令(写入存储器)
- 弹出(POP)
- 压栈(PUSH)
2.3.3. 输入/输出(I/O)指令#
设置专门的 指令如 IN
采用通用的数据传输指令如 MOV
2.3.4. 算术逻辑运算指令#
2.3.4.1. 算术运算指令
- 定点加 (ADD)
- 减 (SUB)
- 加1 (INC)
- 减1 (DEC)
- 求补 (NEG)
2.3.4.2. 逻辑运算指令
- 与 (AND)
- 或 (OR)
- 非 (COM)
- 异或 (EOR)
2.3.4.3. 移位指令
- 算术移位指令
- 逻辑移位指令
2.3.4.4. 串操作指令
为了实现对数组元素的操作,许多计算机设置了串操作指令,加上重复前缀 REP,就能对数组进行操作。如串传送指令 (REP MOVS) 可将整个数组从源存储区传送到目的存储区。
2.3.4.5. 专用的数据处理指令
- 转换指令
- 检索指令
- 编辑指令
2.3.5. 程序控制类指令#
2.3.5.1. 转移指令
- 无条件转移指令
- 条件转移指令
- 循环指令
2.3.5.2. 转子程序指令与返回指令
- 转子程序指令。指令中给出操作码以及转移地址,后者是子程序的入口地址。
- 返回指令。只有操作码,返回地址隐含获得。如将堆栈指针SP的内容作为返回地址。
2.3.5.3. 软中断(程序自中断)指令
可用于程序调试中,如利用软中断指令为程序设置断点。如 INT ,除操作码 INT 外,指令还给出一个中断号 ,根据它可以找到中断处理程序入口地址。
2.3.5.4. 控制处理机某些功能的指令
- 对CPU状态字某些标志位的清除、设置、修改
- 空操作指令 NOP
- 实现 CPU与外部事件的同步功能,如暂停 HLT、等待 WAIT、总线锁定LOCK等指令
2.3.5.5. 面向操作系统的一些指令
- 访问系统寄存器的指令,如访问系统控制寄存器、全局描述符表寄存器、任务寄存器等
- 检查保护属性的指令,如检查某个数据段可否被读出、可否被写入,调整段的特权级等
- 用于存储管理的指令