MIPS Как сохранить адрес в стеке? - PullRequest
0 голосов
/ 21 мая 2011

У меня есть этот код:

.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

Что я сделал не так?Я полагаю, что допустил ошибку при загрузке / сохранении адреса.

Ответы [ 3 ]

1 голос
/ 21 мая 2011

Вы пытаетесь выполнить невыровненную 32-разрядную загрузку, которая не разрешена для (общих) архитектур MIPS.Когда i равно единице, вы пытаетесь загрузить адрес формы 0x10010000 (array) + 1 (i).Попробуйте умножить t0 (i) на 4, прежде чем добавить его в t2 (массив)

1 голос
/ 21 мая 2011

Вам нужно умножить i на размер элемента массива, а затем добавить его к базовому адресу массива, чтобы вычислить адрес i-го элемента. Обратите внимание, что если размер элемента составляет 4 байта, это умножение может быть легко выполнено с помощью сдвига влево на два бита.

0 голосов
/ 21 мая 2011

Вместо увеличения i на 1, попробуйте следующее

add $t0, $t0, 4

вместо

add $t0, $t0, 1

Это добавит размер (в байтах) 32-разрядного целого числа к вашему индексу. MIPS требует, чтобы 4-байтовые значения были сохранены и загружены с адресов, кратных 4-байтовым. (Т.е. с младшими двумя битами ноль.)

...