# 2017q1 Homework4 (microarch) ###### tags:`zhanyangch` `sysprog2017` `week4` ![](https://i.imgur.com/mB9jrh7.png) 上圖紅色的 1, 2, 3 對 MIPS 做了對應的修改,請考慮以下狀況,分別解釋對應的程式碼是否能運作: * 做了 1: Stuck at 0 left of cut 的修改,sw $ s1, 0($s2) 能否運作?這樣的修改會使得哪些程式無法運作,請列出至少兩項組合語言列表 * 做了 2 的修改後,以下程式能否運作?解釋並提出可運作的版本 add $s1, $s1, $s1 add $s1, $t0, $t1 * 做了 3 的修改後,以下程式能否運作? addi $s2, $zero, 2 addi $s1, $zero, 2 beq $s2, $s1, exit ## 分析 1. 切斷 Regwrite 會使運算的結果無法寫回 register 2. 切斷 reigster1 的 forwarding ,無法處理一部分的 data hazard 3. 切斷用來計算 condition bench 跳躍時的 address ## 解題 1. sw $ s1, 0($s2) 可以運作,因為是將 s1 的內容寫入記憶體 0( $s2) 的位置 會使得哪些程式無法運作 addi $s2, $zero, 2 lw $ s0,0($s2) 2. add $s1, $s1, $s1 add $s1, $t0, $t1 可以運作,在第二個 add 中 $s1 做為 rd 是被寫入而非被讀取 3. beq $s2, $s1, exit 無法運作 不確定可否用 pseudoinstruction,就使用最原始的寫法 ``` addi $s2, $zero, 2 addi $s1, $zero, 2 jal condj j exit condj: slt $s3, $s1, $s2 slt $s4, $s1, $s2 nor $s3, $s4, $s3 #這三行可以等同於 seq $s3,$s1,$s2 sll $s3, $s3, 2 #s3=s3*4 add $v0, $ra, $s3 #v0=addr+(4 or 0) jr $v0 ``` ## 參考資料 工科系計組講義 [How to load memory address without using pseudo-instructions?](http://stackoverflow.com/questions/7264532/how-to-load-memory-address-without-using-pseudo-instructions) [how to get current PC register value on MIPS arch?](http://stackoverflow.com/questions/15331033/how-to-get-current-pc-register-value-on-mips-arch)