計算機組成原理
數據冒險、控制冒險、結構冒險
對所有用戶(所有程序員)可見: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(訪存階段才會產生結果),故采用轉發旁路已經不能解決數據冒險。