終於來到鐵人賽的一半了~!!
接下來讓我們來看分支指令的部分
分支指令是用來改變程式執行流向的指令
可以分成兩種:條件式 (Conditional Branch)、以及非條件式 (Unconditional Branch)
條件式 (Conditional Branch) 也就是根據比較結果改變程式流向
有 branch if equal (beq) 和 branch if not equal (bne) 兩種
非條件式就只有 jump (j) 一種
今天先來看條件式分支
條件式分支指令實際上是 I 型指令
beq rs, rt, imm #opcode = 4
bne rs, rt, imm #opcode = 5
我們以 beq reg1, reg2, L1 為例
這條指令表示 if (value in reg1) == (value in reg2) goto L1
前兩個為暫存器,後面是 16bits的存儲器位址
CPU 會判斷兩個暫存器內容是否相同,若相同則跳至 L1 所指的位址去取下一條指令
否則就接下去執行下一條指令
在 MIPS 中是沒有 flag 暫存器的,所以在這條指令中可以看到比較和跳轉是在同一條指令上執行
在此也與 x86 的條件轉移指令不同,因為在 x86 中條件轉移指令是根據當前 flag 的狀態來判斷
如此一來轉移指令通常就會接在影響 flag 的算術會運算邏輯指令之後
MIPS 當初設計理念就是希望可以減少這種指令間互鎖的關係,也就是希望避免指令之間相互影響
所以在此也體現了兩種不同的設計模式
從條件指令格式可以看出 immediate 只有 16bits 的位移量,那要怎麼有效的利用呢?
如果以當前 PC 為基準,16bits 的偏移量可以表示正負 2^15bytes 位址
但是 MIPS 指令固定長度為 32bits = 4bytes
所以最後 2bit 一定會是 0,如此一來偏移量就可以調整成 2^17bytes 位址
最後目標地址計算方式如下:
分支條件成立:PC = PC + 4;分支條件不成立:PC = (PC+1) + (4*immediate)
明天將繼續介紹非條件式轉移的指令格式~
我想問branch 16 bits 做sign extended成32 bits 再shift 2 bits 這樣最前面31 30 bit遺失對記憶體位址不影響嗎?