计算机组成原理
数据冒险、控制冒险、结构冒险
对所有用户(所有程序员)可见:PSW、PC、通用寄存器
- PSW(条件转移需要用到,程序员使用CMP指令的时候也需要用到所以是对用户可见)
- PC(跳转指令需要使用PC+n ,所以对用户可见)
- 通用寄存器(程序员写指令可以使用到通用寄存器R)
- 通用寄存器:包括(数据寄存器、地址指针寄存器、变址寄存器)
对所有用户(所有程序员)透明:MAR,MDR,IR,Cache, 微程序结构和功能,控制存储器,锁存器/暂存器
- (这些都是辅助CPU工作,所以是透明的)
- 微指令寄存器属于微程序控制器的组成部分,它是硬件设计者的任务。
- 控制存储器:存放微指令即控制信号
- 锁存器/暂存器:流水线间存储数据
- MAR:存储器地址寄存器
- MDR:存储器数据寄存器
1.结构冒险
结构冒险=结构冲突=资源冲突
load指令是取数指令;Store指令是存数指令
运算类指令
算术运算指令
- 加法指令
- 用于实现两个操作数的相加操作。例如在 RISC-V 指令集中有
add
指令,它可以将两个寄存器中的值相加,并将结果存放在一个寄存器中。 - 格式可能为
add rd, rs1, rs2
,其中rd
是目的寄存器,用于存放结果,rs1
和rs2
是源寄存器,提供操作数。
- 用于实现两个操作数的相加操作。例如在 RISC-V 指令集中有
- 减法指令
- 实现两个操作数的相减操作。如
sub
指令,它从rs1
寄存器的值中减去rs2
寄存器的值,并将结果存放在rd
寄存器中。
- 实现两个操作数的相减操作。如
- 乘法指令
- 完成两个操作数的乘法运算。不同的指令集可能有不同的乘法指令形式。例如,有些指令集可能有
mul
指令用于无符号数乘法,imul
指令用于有符号数乘法等。
- 完成两个操作数的乘法运算。不同的指令集可能有不同的乘法指令形式。例如,有些指令集可能有
- 除法指令
- 用于执行除法操作。像
div
指令用于无符号数除法,idiv
指令用于有符号数除法。在执行除法指令时,通常会涉及到商和余数的处理。
- 用于执行除法操作。像
逻辑运算指令
- 与指令
- 实现按位与操作。例如
and
指令,它对rs1
和rs2
寄存器中的对应位进行与操作,并将结果存放在rd
寄存器中。
- 实现按位与操作。例如
- 或指令
- 执行按位或操作。如
or
指令,将rs1
和rs2
寄存器中的对应位进行或操作,结果存于rd
寄存器。
- 执行按位或操作。如
- 非指令
- 也叫取反指令,对一个操作数的每一位进行取反操作。在一些指令集中可能有
not
指令来实现这个功能。
- 也叫取反指令,对一个操作数的每一位进行取反操作。在一些指令集中可能有
- 异或指令
- 进行按位异或操作。例如
xor
指令,对rs1
和rs2
寄存器中的对应位进行异或操作,结果放在rd
寄存器中。
- 进行按位异或操作。例如
移位运算指令
- 逻辑左移指令
- 将一个操作数的所有位向左移动指定的位数,右边空出的位用 0 填充。例如
shl
指令。
- 将一个操作数的所有位向左移动指定的位数,右边空出的位用 0 填充。例如
- 逻辑右移指令
- 把一个操作数的所有位向右移动指定的位数,左边空出的位用 0 填充。比如
shr
指令。
- 把一个操作数的所有位向右移动指定的位数,左边空出的位用 0 填充。比如
- 算术右移指令
- 对于有符号数,将其所有位向右移动指定的位数,左边空出的位用符号位填充。通常有
sar
指令来实现。
- 对于有符号数,将其所有位向右移动指定的位数,左边空出的位用符号位填充。通常有
2.数据冒险的分析和处理
3.控制冒险的分析和处理
注意:修改PC只在M阶段
4.采用转发技术
Load-use:load指令在M(访存阶段才会产生结果),故采用转发旁路已经不能解决数据冒险。