# 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)