[爆卦]Mips sll是什麼?優點缺點精華區懶人包

為什麼這篇Mips sll鄉民發文收入到精華區:因為在Mips sll這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者ericzx70116 (PigJames)看板Grad-ProbAsk標題[理工] [計組]M...


這個是題目
For the following C statement, what is the corresponding MIPS assembly code?

Assume that the variables f, g, h, i, and j

are assigned to registers $s0, $s1, $s2, $s3, and $s4, respectively.

Assume that the base address of the arrays A and B are in registers $s6 and
$7, respectively.

B[8] = A[i–j];

然後我在網路上找的答案說
sub $t0, $s3, $s4 # $t0 = i-j
sll $t0, $t0, 2 # $t0 = (i-j) * 4
lw $t1, 0($s6) # $t1 = A[0]
add $t1, $t1, $t0 # $t1 = &A[i-j] <--
lw $t1, 0($t1) # $t1 = A[i-j]
sw $t1, 32($s7) # B[8] = A[i-j]

為什麼 add $t1, $t1 ,$t0 會是 $t1 = &A[i-j]
而不是 $t1 = A[0] + (i-j)呢?

會有這個疑問是因為我在老師上課的投影片中看到類似的是,

題目
g = h + A[8];
$s1=g
$s2=h
$s3=A[0]

答案
la $s3, value   # $s3 = &A[0]
lw $t0, 32($s3)  # $t0=A[8]
li $s2, 1     # h=1
add $s1, $s2, $t0 # g=h+A[8]=1+9=10 <--

value: .word 1, 2, 3, 4, 5, 6, 7, 8, 9 # A[0]…A[8]
______________________________________________________

還有一個問題就是我不太了解 $s3 = A[0] << 這個意思是什麼意思,
老師上課說這表示 $s3 存的是 A[]的base address
可是如果$s3存的是address的話,上面的 g=h+A[8] 不就不成立了嗎?
因為$t0是 32($s3) 是 A[8]的address , address應該不可以跟數值相加才對不是嗎?

麻煩各位大大了,抱歉><

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.119.121.6
※ 文章網址: https://www.ptt.cc/bbs/Grad-ProbAsk/M.1477574265.A.350.html
※ 編輯: ericzx70116 (140.119.121.6), 10/27/2016 21:22:04
※ 編輯: ericzx70116 (140.119.121.6), 10/27/2016 21:24:54
ken52011219: 主要的差異是Sll 左移兩bit 使值變為address 10/27 22:11
ken52011219: 而不再只是單純為 兩值相加 實際應為 A[i-j+0] 10/27 22:13
kyuudonut: 1. address 當然可以相加 他只是暫存器裡面的值 10/27 22:16
kyuudonut: 2. "$s3 = A[0]" 這句表達的是 $s3存的是A[0] 10/27 22:17
kyuudonut: 絕對不是A[] ... "$s3 = &A[0]" 才是表達base addr. 10/27 22:18
ericzx70116: 感謝兩位大大幫忙>< 我瞭解了 10/28 11:28
opu456: $s6裡存的是A的address吧 怎麼會用lw 還是我理解錯題目意 10/28 22:22
opu456: 思? 10/28 22:22
opu456: Assume that the base address of the arrays A and B are 10/28 22:22
opu456: in registers $s6 and$7, 10/28 22:22
opu456: A[0]+(i-j)*4 怎麼會是A[i-j]的address 10/28 22:26
opu456: 應該要&A[0]+$t0才對吧? 還是我觀念錯了?orz 10/28 22:28
ken52011219: http://i.imgur.com/SHPp0j8.jpg 10/28 23:35
ken52011219: 很久沒寫計組 有點吃力 但大致上如我圖上所說 應該是 10/28 23:37
ken52011219: 沒有寫錯啦XDD 10/28 23:37
PTTleader: ken圖中 lw $t1 0($s6)//$t1 = A[0]之address 這句話 10/29 01:45
PTTleader: 是對的嗎? $s6 照題目說的應該就是A的base address了吧 10/29 01:46
PTTleader: http://imgur.com/a/m1FFA 這是我在網路上找到的... 10/29 01:56
ken52011219: Assemble language 可以有各式各樣的方法 去寫出 只 10/29 08:35
ken52011219: 端看要寫成簡單和複雜 10/29 08:35
ken52011219: 但我是蠻常看到使用lw Reg 0(?)的技巧@@ 10/29 08:40
ken52011219: 哦 我好像回錯意思了 但撇開掉上一句 我覺得兩者皆可 10/29 08:46
ken52011219: 吧 10/29 08:46
PTTleader: 就MIPS來說 10/29 11:11
PTTleader: lw $t1 0($s6) 這句是$t1 = A[0] 的意思吧... 10/29 11:11
PTTleader: 這樣根本不對啊 10/29 11:12
ken52011219: 你說的沒錯 這部分不用加這段才是正確的 10/29 11:43
ken52011219: 是我把lw 跟la的用途搞混了 QQ 抱歉 10/29 11:44
ken52011219: Lw 如前兩位所說的是指 A[address]內的值 10/29 11:47
ken52011219: 感謝糾正 ! 10/29 13:04

你可能也想看看

搜尋相關網站