contributed by <csielee
>
上次這個小測驗一出,真的是備受打擊
居然把計算機組織忘光光了
了解 CPU 可是資工人的浪漫,複習之路 go!
重新把計算機組織結構看過
真的覺得整理的很好
該題目是一個 piplining 的CPU
能夠偵測 Harazd並解決
Data Hazard
Control Hazard
做了 1: Stuck at 0 left of cut 的修改,sw $s1, 0($s2)
能否運作?這樣的修改會使得哪些程式無法運作,請列出至少兩項組合語言列表
sw $s1, 0($s2)
可以運作
因為沒有需要存進暫存器,是要把資料存進記憶體
cut 掉這條線造成在 WriteBack(WB) 階段,無法告訴 register 要將資料存進暫存器,因為 RegWrite 永遠是 0
無法運作的指令
做了 2 的修改後,以下程式能否運作?解釋並提出可運作的版本
add $s1, $s1, $s1
add $s1, $t0, $t1
可以運作
cut 掉這條線,會造成 Rs 的 forwarding 失效
但是在這個範例中
add $s1, $t0, $t1
的 $s1
是 Rd
所以沒有 Data hazard 的問題
做了 3 的修改後,以下程式能否運作?
addi $s2, $zero, 2
addi $s1, $zero, 2
beq $s2, $s1, exit
不能運作
把這條線 cut 掉,會造成所有 branch 指令失效
因為在 ID 階段,如果 condition 成立會將 label 的值加在 PC 上並給 PC
但是這部份被 cut 掉,所以當然就失效了
而且因為所有 branch 指令失效
基本上也不能使用 while、for、if 等結構
這結論下太早了,並不是所有類型的 branch 都會失敗,試著將直接表示的數值變更,思考有沒有能夠運作的程式碼 –jserv
抱歉,結論下的太早
我看到 PC 來源只有 PC+4 跟 PC+4+(imm*4)
就以為 cut 那條會讓所有 branch 指令失效 東霖
重新查詢一些資料
發現這張圖挺不錯的
其實 cut 掉這條線,最主要是會造成 condition branch 失效
也就是無法使用 beq 、 bne 指令
但是直接跳轉跳躍,或是從 $ra($31) 取得 addres 都是可行的
"jump" 的繁體中文翻譯是「跳躍」,不是「跳轉」,請注意 –jserv
因此上述的 code 能夠修改成
修改後的版本
cmp:
slt $t1, $s1, $s2
slt $t2, $s2, $s1
add $t1, $t1, $t2
sll $t1, $t1, 2
add $ra, $ra, $t1
jr $ra
addi $s2, $zero, 2
addi $s1, $zero, 2
jal cmp
j exit
利用 jal 會把下一個指令位置存在 $ra 的特性
我們把 j exit 這個指令的位置存在 $ra
並且到 cmp 的部份去操作 $ra ,讓 PC 得到我們想要的結果
因為 slt $t1, $s1, $2
跟 slt $t2, $s2, $s1
最後會有三種結果
經過 add $t1, $t1, $t2
剩兩種
因此把 $t1 乘上 4 之後加到 $ra 上
就能控制要不要跳過 j exit
這條指令
又不失去讓 $s1, $s2 比較的效果
這部份讓我思考很久,一直在想能不能夠直接取得 PC 的值
但是我觀察 32 個暫存器,沒有一個是 PC 的暫存器
所以我想應該是無法直接存取到 PC
不知道這部份的想法有沒有錯誤 東霖
老師提示說這個修改版本能夠更短 東霖