2011-05-20 51 views
0

我有這樣的代碼:MIPS如何在堆棧上保存地址?

.data 

    array: .word 13, 11, 5, 9, 0, -3 
    size: .word 6 

.text 

Main: 
    la $a0, array 
    lw $a1, size 
    jal PrintIntArray 
    j Exit 

# $a0 - array, $a1 - size 
PrintIntArray: 
addi $sp, $sp, -12 
li $t0, 0 
sw $t0, 0($sp) # i 
sw $a0, 4($sp) # array 
sw $a1, 8($sp) # size 

li $a0, '[' 
li $v0, 11 
syscall 

lw $t1, 8($sp) # size 
ble $t1, $0, EmptyArray 
    PrintLoop: 
     lw $t1, 8($sp) # size 
     lw $t0, 0($sp) # i 
     bge $t0, $t1, PrintLoopEnd 
      lw $t0, 0($sp) # i 
      lw $t2, 4($sp) # array 
      add $t2, $t2, $t0 

      lw $a0, 0($t2) # <====== RUNTIME EXCEPTION AT THIS LINE !!! 
      li $v0, 1 
      syscall 

      li $a0, ',' 
      li $v0, 11 
      syscall 

      lw $t0, 0($sp) # i 
      add $t0, $t0, 1 
      sw $t0, 0($sp) 
      j PrintLoop 
    PrintLoopEnd: 
EmptyArray: 

li $a0, ']' 
li $v0, 11 
syscall 

jr $ra 

Exit: 

由我標誌着該生產線將產生以下運行時異常:在util.asm線37

錯誤:運行時 異常在0x00400060:取地址 未在字邊界上對齊 0x10010001

我做錯了什麼?我想我在加載/存儲地址時犯了一些錯誤。

回答

1

您需要將i乘以數組元素的大小,然後將其添加到數組的基地址以計算第i個元素的地址。請注意,如果元素大小爲4個字節,則可以通過左移兩位輕鬆執行該乘法操作。

1

您正在嘗試執行未對齊的32位加載,這是(通用)MIPS體系結構上不允許的。當i等於1時,您嘗試加載表單地址0x10010000 (array) + 1 (i)。通過1將它添加到t2(陣列)

0

而不是增量i之前嘗試乘以4 T0(i)中,嘗試以下

add $t0, $t0, 4 

而非

add $t0, $t0, 1 

這將增加大小,以字節爲單位,32位整數到您的索引。 MIPS要求將4字節值存儲到4字節倍數的地址並從中加載。 (即,低位兩位爲零)。