還是一樣難過QuQ
今天要來記錄個 記憶體位置變數化(其實我不知道要怎麼形容它@@)
我搜尋關鍵字是這個:mips lw offset
就是呢
在處理陣列時要儲存元素就需要使用lw指令
(什麼opcode、I-type就不記錄了....
例如:
Array的起始位址為0x10010000
把它暫存在$t0 (這寫法是助教給的
addi $t0, $zero, 4097 # $t0 = 0x00001001 sll $t0, $t0, 16 # set the base address of array into $t0 = 0x10010000
若要使用元素
lw $t1, 0($t0) # 第一個(index = 0) lw $t1, 4($t0) # 第二個(index = 1) lw $t1, 8($t0) # 第三個(index = 2) lw $t1, 12($t0) # 第四個(index = 3)
那個()前的數字:0、4、8、12....就是offsets
代表第幾個,4的倍數的原因是一個word有4bytes所以下一個就要跳4
這樣不是超級麻煩嗎?
而且無法搭配迴圈使用QuQ
再來就是我找到的解法了
首先有一個變數來存index
把它乘以4
把它跟初始位址相加就是index所在的位址啦
以下範例搭配迴圈使用:
.data Array: .word 9, 2, 8, 1, 6, 5, 4, 10, 3, 7 # Array .text main: addi $t0, $zero, 4097 # $t0 = 0x00001001 sll $t0, $t0, 16 # set the base address of array into $t0 = 0x10010000 loop: beq $t1, 10, exit # if $t1 == 10 break sll $t1, $t1, 2 # $t1 *= 4 add $t2, $t0, $t1 # $t2 = address of Array[$t1] srl $t1, $t1, 2 # $t1 /= 4 addi $t1, $t1, 1 # $t1++ lw $t3, 0($t2) # $t3 = Array[$t1]!!!! j loop exit: li $v0, 10 # program stop syscall所以就是每次都把初始位址 + index*4
之後為啥要除以4知道吧
因為是用那個在計數的,沒除回來一下就超過Array大小了
如果多給一個記憶體是也可以不用除回來啦OuO
參考資料:
MIPS offsets with variables
沒有留言:
張貼留言