106.04.01 組合語言 記憶體位置變數化

恩....好
還是一樣難過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

沒有留言:

張貼留言

^ Top