写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。
计算机组成原理(哈工大刘宏伟)135讲(全)高清_哔哩哔哩_bilibili
《计算机组成原理》唐朔飞 第5章 输入输出系统 - 学习笔记_友人帐_的博客-CSDN博客
《计算机组成原理》唐朔飞 第7章 指令系统 - 学习笔记_友人帐_的博客-CSDN博客
《计算机组成原理》唐朔飞 第8章 CPU的结构和功能 - 学习笔记_友人帐_的博客-CSDN博客
《计算机组成原理》唐朔飞 第9章 控制单元的功能 - 学习笔记_友人帐_的博客-CSDN博客
《计算机组成原理》唐朔飞 第10章 控制单元的设计 - 学习笔记_友人帐_的博客-CSDN博客
计算机组成原理(第三版)唐朔飞-课后习题(完整版)_计算机组成原理唐朔飞第三版答案_蓝净云的博客-CSDN博客
计算机组成原理实验一 运算器 预习报告_基本运算器实验_旅僧的博客-CSDN博客
计算机组成原理实验二 存储系统 预习报告_旅僧的博客-CSDN博客
计算机组成原理实验三 系统总线和具有基本输入输出功能的总线接口 预习报告_旅僧的博客-CSDN博客
计算机组成原理实验四 微程序控制器 实验报告_旅僧的博客-CSDN博客
用来指明该指令所完成的操作,其位数反映了机器允许的指令条数。
(1)操作码的长度
长度固定:将操作码集中放在指令字的一个字段内。便于硬件设计,指令译码时间段,广泛用于字长较长的精简指令集计算机(RISC)中。
长度不固定:操作码分散在指令字的不同字段中。可以有效地压缩操作码的平均长度,在字长较短的微型计算机中广泛使用。
(2)扩展操作码技术
操作码长度不固定会增加指令译码和分析的难度,使控制器的设计复杂。通常采用扩展操作码技术,使操作码的长度随地址数的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
保留码点方式:
操作码的位数随着地址数的减少而增加。为了使计算机能够识别操作码的位数,保留1111字段,作为拓展标记(见下图,图中操作数的地址码为4位)。
零地址、一地址、二地址指的是操作数有几个。指令字长固定的情况下,操作码的位数 = 指令字长 - 地址字长。可以通过不断减少多地址指令的操作码种类,来增加少地址指令的条数。
地址码用来指出该指令的源操作数的地址(一个或两个)、结果的地址以及下一条指令的地址。这里的“地址"可以是主存的地址,也可以是寄存器的地址,甚至可以是I/О设备的地址。
以主存地址为例,分析指令的地址码字段。通过下面的分析可见,通过利用一些硬件资源(ACC、PC等),可在不改变指令字长的前提下,扩大指令操作数的直接寻址范围、减少访存次数,以提高机器性能。
(1)四地址指令
OP | A 1 A_1 A1 | A 2 A_2 A2 | A 3 A_3 A3 | A 4 A_4 A4 |
---|
其中,OP为操作码; A 1 A_1 A1为第一操作数地址; A 2 A_2 A2为第二操作数地址; A 3 A_3 A3为结果地址; A 4 A_4 A4为下一条指令的地址。
(2)三地址指令
程序计数器PC既能存放下一条指令的地址,又可以自加1,使用PC代替 A 4 A_4 A4字段,得到三地址指令格式。
OP | A 1 A_1 A1 | A 2 A_2 A2 | A 3 A_3 A3 |
---|
(3)二地址指令
没必要将每次结果都存入主存,可以暂存在CPU的寄存器中,省去 A 3 A_3 A3字段,得到二地址指令。
OP | A 1 A_1 A1 | A 2 A_2 A2 |
---|
(4)一地址指令
将一个操作数的地址隐含在运算器的ACC中,指令字中只需给出一个地址码。
OP | A 1 A_1 A1 |
---|
(5)零地址指令
无地址码,例如空操作(NOP)、停机(HLT)这类指令只有操作码;子程序返回(RET)、中断返回(IRET)这类指令操作数的地址隐含在堆栈指针SP中。
指令字长取决于操作码的长度、操作数地址的长度和操作数的个数。
(1)指令字长固定
可以设置为机器字长和存储字长相等,因此访问某个存储单元,便可取出一条完整的指令或一个完整的数据。
(2)指令字长可变
一般按照字节的倍数变化。
地址:绝对地址无符号整数;相对地址有符号数。
数字:定点数、浮点数、十进制数。
字符:普遍使用ASCII码。
逻辑数据:1真0假,参与逻辑运算。
(左:小端序;右:大端序)
数据存放的起始地址是数据类型大小的整数倍。
源 | 目的 | 指令示例 |
---|---|---|
寄存器 | 寄存器 | MOVE |
寄存器 | 存储器 | STORE; MOVE; PUSH |
存储器 | 寄存器 | LOAD; MOVE; POP |
存储器 | 存储器 | MOVE |
置1、清0等。
(1)无条件转移 JMP
(2)条件跳转
根据条件码来进行跳转。
(3)调用CALL与返回RET
CALL用于从当前的程序位置转至子程序的入口;RETURN用于子程序执行完成后返回到原程序的断点。
(4)陷阱Trap与陷阱指令
一旦运行过程中出现意外故障,计算机就发出陷阱信号,暂停当前程序的执行,转入故障处理程序进行相应的故障处理。
陷阱指令一般不提供给用户直接使用,而是作为隐指令在出现意外故障时由CPU自动产生并执行。
对于I/O单独编址的计算机而言,通常设有输入输出指令,它完成从外设中的寄存器读人-个数据到CPU的寄存器内,或将数据从CPU的寄存器输出至某外设的寄存器中。
其他包括等待指令、停机指令﹑空操作指令、开中断指令.关中断指令、置条件码指令等。
寻址方式是指确定本条指令的数据地址以及下一条将要执行的指令地址的方法。
通过程序计数器PC加1,自动形成下一条指令的地址。(加1并不是实际上加1,而是加1个单位,使得指向下一条指令。可能是2字节、4字节、8字节等)
通过转移类指令实现。
数据寻址方式种类较多,在指令字中必须设一字段来指明属于哪一种寻址方式。
形式地址A:指令字中的地址。通常都不代表操作数的真实地址。
有效地址EA:操作数的真实地址,由寻址方式和形式地址共同来确定的。
假设指令字长、存储字长、机器字长相等。
形式地址A不是操作数的地址,而是操作数本身(补码),称为立即数。使用#
表示立即寻址特征标记。
形式地址A就是操作数的真实地址EA。
指令字中不明显地给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中。
例如,一地址格式的加法指令只给出一个操作数的地址,另一个操作数隐含在累加器ACC中,这样累加器ACC成了另一个数的地址。
形式地址不直接指出操作数的地址,而是指出操作数有效地址所在的存储单元地址,即EA=(A)。(指针)
在寄存器寻址的指令字中,地址码字段直接指出了寄存器的编号,即 E A = R i EA=R_i EA=Ri。其操作数在由R所指的寄存器内。
寄存器中存放的是操作数所在主存单元的地址,即 E A = ( R i ) EA=(R_i) EA=(Ri)。
基址寻址需设有基址寄存器BR,其操作数的有效地址EA等于指令字中的形式地址与基址寄存器中的内容(称为基地址)相加,即EA=A+(BR)。
!BR的值由操作系统自动给出,用户不得修改。
基址寄存器分为显式和隐式两种:
其有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA=A+(IX)。
!IX的值由用户给定。
基址寻址与变址寻址的区别:
- 基址寻址主要用于为程序或数据分配存储空间,故基址寄存器的内容通常由操作系统或管理程序确定,在程序的执行过程中其值是不可变的,而指令字中的A是可变的。
- 在变址寻址中,变址寄存器的内容是由用户设定的,在程序执行过程中其值可变,而指令字中的A是不可变的。
变址寻址主要用于处理数组问题,在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。
有效地址是将程序计数器PC与指令字中的形式地址A相加而得,即EA=(PC)+A。
堆栈寻址要求计算机中设有堆栈。
堆栈既可用寄存器组(称为硬堆栈)来实现,也可利用主存的一部分空间作堆栈(称为软堆栈)。
以软堆栈为例,可用堆栈指针SP(Stack Point)指出栈顶地址,也可用CPU中一个或两个寄存器作为SP。操作数只能从栈顶地址指示的存储单元存或取。可见堆栈寻址也可视为一种隐含寻址,其操作数的地址总被隐含在SP中。堆栈寻址就其本质也可视为寄存器间接寻址,因SP可视为寄存器,它存放着操作数的有效地址。
SP的修改与主存编址方式有关。进栈-,出栈+,向低地址生长。
指令系统的兼容性
操作类型:包括指令数及操作的难易程度。
数据类型:确定哪些数据类型可以参与操作。
指令格式:包括指令字长、操作码位数、地址码位数、地址个数、寻址方式类型,以及指令字长和操作码位数是否可变等。
寻址方式:包括指令和操作数具体有哪些寻址方式。
寄存器个数:寄存器的多少直接影响指令的执行时间。
精简指令系统计算机 (Reduced Instruction Set Computer)
与之对应的为:CISC ,复杂指令系统计算机 (Complex Instruction Set Computer)
LOAD
/STORE
指令访存