chap2 指令系统
1.指令格式
冯·诺伊曼结构机器对指令的规定:
① 用二进制表示,和数据一起存放在主存中;
② 由两部分组成:操作码和地址码
1.1 机器指令要素
- 操作码:指定操作类型
- 源操作数或其地址:一个或多个源操作数所在的地址
- 结果的地址:产生的结果存放何处(目的操作数)
- 下一条指令地址:下条指令存放何处(正常情况隐含在PC中,改变顺序时由指令给出)
- 指令格式:用二进制代码表示指令的结构形式
1.2 指令字长
指令中包含二进制代码的位数,与机器字长相比,可以分为:
- 单字长:与机器指令长度一样
- 双字长:是机器指令长度的两倍
- 半字长:是机器指令长度的一半
- 多字长:
- 优点:可以解决寻址较大存储空间的问题
- 缺点:取值多次访问内存,影响速度,占用空间大
依据指令字长是否固定,可以分为:
- 定长指令:指令字长度固定
- 变长指令:指令字长度根据需要可变,一般为字节的整数倍
1.3 操作码
每条指令对应一个操作码,操作码指出该指令应该执行什么性质的操作和具有何种功能,是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。操作码字段的位数与支持的最大指令数量有关,依据操作码长度是否固定,可以分为:
- 固定长度操作码:
- 操作码长度固定不变
- 硬件设计简单,指令译码时间开销较小,指令空间效率较低
- 可变长度操作码
- 操作码向不用的地址码字段扩展
- 硬件设计相对复杂,指令译码时间开销较大,指令空间利用率较高
定长/变长的指令/操作码如何选择
- 代码长度更重要时,采用变长指令字、变长操作码
- 性能更重要时,采用定长指令字、定长操作码
操作码的扩展
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
- 各指令的操作码一定不能重复
- 通常情况下,对于使用频率较高的指令,分配较短的指令码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间
1.4 地址码
假设指令字长及存储字长均为32位,其中操作码占8位
- 四地址指令:4个地址码字段各占6位,指令操作数直接寻址范围为26=642^6=6426=64,完成一条指令需要访存四次(取指令+取两个操作数+存回结果)
- 三地址指令:3个地址码字段各占8位,指令操作数直接寻址范围为28=2562^8=25628=256,完成一条指令需要访存四次(取指令+取两个操作数+存回结果)
- 二地址指令:2个地址码字段各占12位,指令操作数直接寻址范围为212=4K2^12=4K212=4K,完成一条指令需要访存四次(取指令+取两个操作数+存回结果)
- 一地址指令:1个地址码字段占24位,指令操作数直接寻址范围为224=16M2^24=16M224=16M
- 零地址指令:
2.寻址方式
2.1 指令寻址
- 顺序寻址:程序对应的机器指令序列在主存顺序存放,执行时从第一条指令开始,逐条取出并执行
实现:由程序计数器(PC)对指令序号进行计数,PC存放下条指令地址,初始值为程序首地址,取出一条指令到指令寄存器(IR)并执行,之后PC=PC+指令字节长度
- 跳跃寻址:程序中出现分支或循环时,就会改变程序的执行顺序
实现:重新修改PC的内容,然后进入取指令阶段
2.2 操作数寻址
A. 操作数的位置:存储器、寄存器、输入输出端口
B. 操作数寻址:找到操作数、形成操作数有效地址的方法->实际有效地址为EA,实际操作数S=(EA)
C. 寄存器和寄存器堆
寄存器是用来暂存信息的逻辑部件;寄存器堆(Register File),也称通用寄存器组,CPU内部用于暂存指令执行过程中的中间数据,有许多寄存器组成,每个寄存器有一个编号,CPU可以对指定编号的寄存器进行读写
- 内部结构:寄存器堆中共有2k2^k2k个寄存器,每个寄存器位数为n,
RA
和RB
分别是读口1和读口2的寄存器编号,RW
是写口的寄存器编号
- 工作机制:
- 读操作属于组合逻辑操作,由
RA
和RB
分别选择对应寄存器中的内容送到busA
、busB
- 写操作属于时序逻辑操作,需要时钟信号
CLK
和写使能信号WE
的控制,需要保证时钟信号到来之前,地址RW
、数据busW
和写使能信号WE
都已经稳定一个建立时间以上- 优势:
- 寄存器比存储器快
- 寄存器易于编译器使用
- 寄存器可以保存变量
- 减少存储器访问,提高速度
- 提高代码密度,寄存器地址比存储器地址短
Ⅰ. 立即寻址
形式地址A就是操作数本身,又称为立即数,一般采用补码形式,如果A的位数为n,则可表示的数据范围为−2n−1 2n−1−1-2^{n-1}~2^{n-1}-1−2n−1 2n−1−1
一条指令的执行共访存一次(取指令)
- 优点:指令执行阶段不访问主存,指令执行时间最短
- 缺点:A的位数限制了立即数的范围
Ⅱ. 直接寻址
指令字中的形式地址A就是操作数的真实地址EA,即EA=A
一条指令的执行共访存2次(取指令1次+执行指令1次)
- 优点:简单,指令执行阶段仅访问一次贮存,不需要专门计算操作数的地址
- 缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不宜修改
Ⅲ. 间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)
- 优点:
- 可扩大寻址范围:有效地址EA的位数大于形式地址A的位数
- 便于编制程序:用间接寻址可以方便地完成子程序的返回
- 缺点:
- 指令在执行阶段要多次访存(一次间址需要两次访存,多次寻址需根据存储字的最高位确定几次访存)
Ⅳ. 寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即EA=R1EA=R_1EA=R1,其操作数在由R1R_1R1所指的寄存器内
一条指令的执行共访存一次(取指令)
- 优点:
- 指令在执行阶段不访问主存,只访问寄存器;
- 指令字短且执行速度快,支持向量/矩阵运算
- 缺点:寄存器价格昂贵,计算机中寄存器个数有限
Ⅴ. 寄存器间接寻址
寄存器R1R_1R1中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(R1)EA=(R_1)EA=(R1)
一条指令的执行共访存两次(取指令1次+执行指令一次),与一般间接寻址相比速度更快,但是指令的执行阶段需要访问主存(操作数在主存中)
Ⅵ. 偏移寻址
-
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于当前指令地址的位移量,可正可负,补码表示。
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,广泛应用于转移指令
-
基址寻址:将CPU中基址寄存器(BR)的内容加上指令字中的形式地址A而形成操作的有效地址,即EA=(BR)+A。可以扩大寻址范围(基址寄存器的位数大于形式地址A的数);且用户不必考虑自己的程序存在主存的哪个空间区域,故有利于多道程序设计,以及可用于制浮动程序。
- 基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)
- 当采用通用寄存器作为基址寄存器时,可以由用户决定哪个寄存器作为基址寄存器,但其内容仍然由操作系统确定
-
变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA=(IX)+A,其中IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器。同样可以扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可以很容易形成数组中任一数据的地址,特别适合编制循环程序
- 变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可以由用户改变(作为偏移量),形式地址A不变(作为基地址)
3.RISC-V指令系统
3.1 系统概述
模块化的设计思路:很小的标准基础ISA,很多标准扩展
- 4种基础整数指令集:RV32I、RV64I、RV128I、RV32E(是“16个寄存器”的RV32I变种)
- 标准扩展:
- M-整数乘除
- A-原子操作
- F-单精度浮点
- D-双精度浮点
- G-IMAFD,一个通用的组合
- C-压缩指令
- V-向量计算
除了RVC,上述指令均采用固定4字节的指令长度,可以根据需求进行自由组合,例如:
- 嵌入式(处理器越小越好)-RV32E
- 嵌入式(存储器越小越好)-RV32IC
- 教学-RV64IMA
- 桌面-RV64GC
- 高性能-RV64GCBV
除此之外,还支持自定义指令(属于非标准扩展)
3.2 RISC-V基础整数指令集(RV32I)
opcode
:操作码字段rd
、rs1
、rs2
:通用寄存器编号imm
:立即数funct3
、funct7
:分别表示3位功能码和7位功能码,和opcode字段一起定义指令的操作功能
RV32I指令格式特点分析
- RV32I为定长指令集:操作码字段预留了扩展空间,可扩展为变长指令
- 没有寻址方式字段,寻址方式由操作码决定
- 指令字中的各字段位置固定:指令硬件更易实现,提高指令译码速度
- 立即数最高位固定在指令字最高位,方便立即数的符号扩展
32个32位RISC-V通用寄存器调用约定
程序寄存器PC是单独的寄存器
R型-寄存器操作数指令
rs1、rs2、rd:5位通用寄存编号,共32个;两个源操作数分别在rs1和rs2寄存器中,结果存rd寄存器;
操作码opcode都是0110011,其功能由funct3指定:当funct3=000、101时,再由funct7区分是加、减、逻辑右移还是算术右移(逻辑左移与算术左移结果完全相同)
I型-短立即数或Load指令
- 操作码opcode:都是0010011,其功能由funct3指定,而当funct3=101时,再由高7位区分是算术右移(srai)还是逻辑右移(srli)
- imm[11:0]:12位立即数,符号扩展为32位,作为第二个源操作数,和R[rs1]R[rs1]R[rs1](寄存器rs1中的内容)进行运算,结果存在rd
- shamt:指明移出位数,因为最多移31位,故用5位即可
S型-Store指令
功能:M[R[RS1]+IMM12]<−R[rs2]M[R[RS1]+IMM12]<-R[rs2]M[R[RS1]+IMM12]<−R[rs2],其中sb、sh分别将rs2寄存器中低8、16位写入存储单元中
B型-条件跳转指令
皆为分支指令,其中bltu、bgeu分别为无符号数比较小于、大于等于转义,转移目标地址=PC+imm[12:1]<<1
U型-长立即数操作指令
I型指令立即数最多12位,范围小,为了表示更大的数,设置了U型指令