自己動手寫CPU(9) 轉移指令說明

2021-10-13 10:34:55 字數 3957 閱讀 7649

跳轉指令是絕對轉移

jr:將位址為rs的通用暫存器的值賦值給暫存器pc

jalr:將位址為rs的通用暫存器的值賦值給暫存器pc,作為新的指令位址,同時將跳轉指令後面指令的位址作為返回位址儲存在位址為rd的通用暫存器,如果沒有在指令中指明rd,那麼預設將返回位址儲存到$31

op[31:26]

rs[25:21]

rt[20:16]

rd[15:11]

sa[10:6]

func[5:0] 名稱

指令用法

指令作用

指令碼[31:26]

rt[20:16]

目的暫存器rd[15:11]

移位相關[10:6]

功能碼[5:0]

jrjr rs

pc 6』b 00_0000

5』b 00000

5』b 00000

5』b 00000

6』b 00_1000

jalr

jalr rs 或者 jalr rd, rs

rd 6』b 00_0000

5』b 00000

rd5』b 00000

6』b 00_1001

j:轉移到新的指令位址,其中新指令位址的低28位是指令中的target(也就是instr_index)左移兩位的值,新指令位址的高4位是跳轉指令後面延遲槽指令的位址高4位

jal:轉移到新的指令位址,新指令位址與指令j相同。指令jal還要將跳轉指令後面指令的位址作為返回位址儲存到暫存器$31

op

instr_index 名稱

指令用法

指令作用

指令碼[31:26]

jj target

pc 6』b 00_0010

jaljal tatget

pc 6』b 00_0011

分支指令是相對轉移,其中b、bal指令不用單獨實現,需要openmips實現俺的分支指令只有8條。

beq:將位址為rs的通用暫存器的值與位址為rt的通用暫存器的值進行比較,如果相等,那麼發生轉移。

b:無條件轉移。b指令可看作是beq指令的特殊情況,當beq指令的rs、rt都為0,即為b指令。openmips中不用刻意實現b指令,只需要實現beq指令。

bgtz:如果位址為rs的通用暫存器的值大於0,那麼發生轉移。

blez:如果位址為rs的通用暫存器的值小於等於0,那麼發生轉移。

bne:如果位址為rs的通用暫存器的值不等於位址為rt的通用暫存器的值,那麼發生轉移。

bltz:如果位址為rs的通用暫存器的值小於0,那麼發生轉移。

bltzal:如果位址為rs的通用暫存器的值小於0,那麼發生轉移,並且將轉移指令後面指令的位址作為返回位址,儲存到通用暫存器$31。

bgez:如果位址為rs的通用暫存器的值大於等於0,那麼發生轉移

bgezal:如果位址為rs的通用暫存器的值大於等於0,那麼發生轉移,並且將轉移指令後面指令的位址作為返回位址,儲存到通用暫存器$31。

bal:無條件轉移,並且將轉移指令後面第2條指令的位址作為返回位址,儲存到通用暫存器$31中。bal指令可以看作是bgezal指令的特殊情況,當bgezal指令的rs為0時,就是bal指令。openmips中不用刻意實現bal指令,只需要實現bgezal指令。

所有分支指令的第0~15bit儲存的都是offset,如果發生轉移,那麼將offset左移2位,並符號擴充套件值32位,然後與分支指令下一條指令的 位址相加(流水線中與延遲槽指令的位址相加),加法的結果就是轉移目的位址,從該位址取指令

轉移目標位址 = (signed_extend)(offset || 『00』) + (pc + 4)

op[31:26]

rs[25:21]

rt[20:16]

offset[15:0] 名稱

指令用法

指令作用

指令碼[31:26]

rs[25:21]

rt[20:16]

beqbeq rs, rt, offset

if rs = rt then branch

6』b 00_0100

rsrt

bb offset

無條件轉移

6』b 00_0100

5』b 00000

5』b 00000

bgtz

bgtz rs, offset

if rs > 0 then branch

6』b 00_0111

rs5』b 00000

blez

blex rs, offset

if rs ≤ 0 then btanch

6』b 00_0110

rs5』b 00000

bnebne rs, rt, offset

if rs ≠ rt then branch

6』b 00_0101

rsrt

bltz

blte rs, rt, offset

if rs < 0 then branch

6』b 00_0001

rs5』b 00000

bltzal

bltzal rs, offset

if rs < 0 then branch

6』b 00_0001

rs5』b 10000

bgez

bgez rs, offset

if rs ≥ 0 then branch

6』b 00_0001

rs5』b 00001

bgezal

bgezal rs, offset

if rs ≥ 0 then branch

6』b 00_0001

rs5』b 10001

balbal offset

無條件轉移

6』b 00_0001

5』b 00000

5』b 10001

指令確定過程,解碼模組的走向

假設有這一串指令

ori_1

jr                      # jump to ori_4

ori_2

ori_3

ori_4

ori_5

流水線設計,openmips中,在解碼階段進行判斷轉移,這樣的話會造成乙個時鐘節拍的浪費,所以引入延遲槽,減少轉移帶來的損失。轉移指令在轉移之前都要先執行延遲槽指令(ori_2),所有的分支指令在轉移到目標位址前都要先執行延遲槽中的指令。

指令執行順序: ori_1 -> jr -> ori->2 -> ori_4 -> ori_5

在單週期設計中,本條轉移指令在執行時就進行轉移判斷。

指令執行順序: ori_1 -> jr -> ori_4 -> ori_5

流水線儲存的返回位址是延遲槽指令的下一條指令位址,即pc_i + 8

單週期儲存的返回位址是轉移指令的下一條指令位址,即pc_i + 4

但是再進行分支指令跳轉時,跳轉的目標位址計算都是乙個結果:

轉移目標位址 = (signed_extend)(offset || 『00』) + (pc + 4)

自己動手寫CPU之第八階段(1) 轉移指令介紹

感興趣的朋友可以在亞馬遜 噹噹 京東等查詢。另外,開展曬書評送書活動,在亞馬遜 京東 噹噹三大圖書 上,發表 自己動手寫cpu 書評的前十名讀者,均可獲贈 步步驚芯 軟核處理器內部設計 本章將為openmips處理器新增轉移指令,轉移指令包括跳轉 分支兩種,區別在於前者是絕對轉移,後者是相對轉移,但...

自己動手寫CPU(5) 移動指令說明

不涉及特殊暫存器lo hi movn 判斷位址為rt的通用暫存器的值,如果不為零,將位址為rs的通用暫存器的值賦給位址為rd的通用暫存器 反之,儲存rd的值 movz 與movn相反。判斷位址為rt的通用暫存器的值,如果為零,將位址為rs的通用暫存器的值賦給位址為rd的通用暫存器 反之,儲存rd的值...

9 轉移指令的原理

1 可以修改ip,或同時修改cs和ip的指令統稱為轉移指令。概括的講,轉移指令就是可以控制cpu執行記憶體中某處 的指令,8086cpu的轉移行為有兩種 1 只修改ip時,稱為段內轉移,比如 jmp ax 2 同時修改cs和ip時,稱為段間轉移,比如 jmp 1000 0 段內轉移又分為 1 短轉移...