国防科大计算机体系结构公开课_02指令系统

国防科大计算机体系结构公开课学习笔记。

第二章:指令系统。(整个课目前来看还是讲得太浅逻辑涣散,决定火速刷完这套视频再找国外的公开课看看了……)

指令集结构概述

每条指令都是直接由 CPU 硬件执行。
RISC:指令长度固定,CISC:指令长度可变。

指令集与 CPU 性能:
$T_{CPU} = CPI × IC × T_{CLK}$
CPI (Cycle Per Instruction):每条指令执行所花费的时钟周期数。
IC:程序执行过程中所执行的指令数量。
$T_{CLK}$:CPU 时钟周期时间/ CPU 主频。


指令集对程序设计各个阶段的影响:
指令集抽象/进一步描述–>程序设计语言–>源程序
源程序经编译器/汇编器转换–>生成指令集对应的目标代码(一般是指令集的二进制表示)
优化编译器:针对指令集的特征优化
指令译码:分离出指令中的操作码、操作数信息
指令集的好坏会影响到 CPI 及数据通路的复杂度

指令集结构分类

CPU 中用来存储操作数的存储单元主要有:堆栈、累加器、寄存器等。
Z = X + Y 表达式在三种类型指令结构上的实现:

堆栈 累加器 寄存器(寄存器-存储器型) 寄存器(寄存器-寄存器型)
PUSH X LOAD X LOAD R1, X LOAD R1, X
PUSH Y ADD Y ADD R1, Y LOAD R2, Y
ADD STORE Z STORE R1, Z ADD R3, R1, R2
POP Z STORE R3, Z

寄存器-存储器型指算术逻辑运算指令可以访问存储器;而寄存器-寄存器型则不可直接访问存储器,所有操作数必须都放在寄存器中方可运算。不过访问寄存器速度更快,所以寄存器-寄存器形式是现代设计的主流,但是它的指令条数较多,目标代码占用的空间较大—>流水线技术。
RSIC:寄存器-寄存器型,x86:寄存器-存储器型。

寻址方式

| 操作码 | 寻址方式 | 操作数 | 寻址方式 | 操作数 |
↑ 其实这个看不大懂,为啥俩操作数只有一个寻址方式?寄存器-存储器型是可以有两个寻址方式的吧?

寻址实际上是从形式地址到实际地址的转换,实际地址亦称有效地址,指明的是存储器单元的地址或寄存器地址。
寄存器寻址、立即数寻址、偏移寻址、寄存器间接寻址(寄存器单元中存储的是操作数所在地址)、基址变址寻址、直接寻址、存储器间接寻址、自增寻址、自减寻址、缩放寻址。

  • 存储器间接寻址的例子:ADD R1, @(R3)含义为Regs[R1]<--Regs[R1] + Mem[Mem[Regs[R3]]]。先从寄存器中取出存储器地址,再从存储器单元中取出操作数地址,最后取出操作数。寻址最慢。
  • 缩放寻址的例子:Add R1, 100(R2)[R3]含义为Regs[R1]<--Regs[R1] + Mem[100 + Regs[R2] + Regs[R3]×d]。当需要依次访问长度不是一个字节的数组的元素时可使用该寻址方式。

MIPS 指令系统结构

寄存器-寄存器型

对 MIPS 细节不太感兴趣,跳了。