2011-05-20 50 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字节倍数的地址并从中加载。 (即,低位两位为零)。