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 我做错了什么?我想我在加载/存储地址时犯了一些错误。     
已邀请:
您需要将i乘以数组元素的大小,然后将其添加到数组的基地址中,以便计算第ith个元素的地址。注意,如果元素大小为4字节,则可以通过向左移两位来轻松执行此乘法。     
您正在尝试执行未对齐的32位负载,这在(通用)MIPS体系结构中是不允许的。当
i
等于1时,您正在尝试加载表格地址
0x10010000 (array) + 1 (i)
。尝试将t0(i)乘以4,然后再将其添加到t2(数组)     
而不是将ѭ1增1,请尝试以下操作
add $t0, $t0, 4
而不是
add $t0, $t0, 1
这会将32位整数的大小(以字节为单位)添加到索引中。 MIPS要求将4字节值存储到4字节倍数的地址并从中加载。 (即,低位两位为零。)     

要回复问题请先登录注册