跳轉指令是絕對轉移
jr:將位址為rs的通用暫存器的值賦值給暫存器pcop[31:26]jalr:將位址為rs的通用暫存器的值賦值給暫存器pc,作為新的指令位址,同時將跳轉指令後面指令的位址作為返回位址儲存在位址為rd的通用暫存器,如果沒有在指令中指明rd,那麼預設將返回位址儲存到$31
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位opjal:轉移到新的指令位址,新指令位址與指令j相同。指令jal還要將跳轉指令後面指令的位址作為返回位址儲存到暫存器$31
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的通用暫存器的值進行比較,如果相等,那麼發生轉移。所有分支指令的第0~15bit儲存的都是offset,如果發生轉移,那麼將offset左移2位,並符號擴充套件值32位,然後與分支指令下一條指令的 位址相加(流水線中與延遲槽指令的位址相加),加法的結果就是轉移目的位址,從該位址取指令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指令。
轉移目標位址 = (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流水線設計,openmips中,在解碼階段進行判斷轉移,這樣的話會造成乙個時鐘節拍的浪費,所以引入延遲槽,減少轉移帶來的損失。轉移指令在轉移之前都要先執行延遲槽指令(ori_2),所有的分支指令在轉移到目標位址前都要先執行延遲槽中的指令。jr # jump to ori_4
ori_2
ori_3
ori_4
ori_5
指令執行順序: 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 短轉移...