Ошибка динамического массива MIPS

Я пытаюсь выделить динамический массив и заставить его принимать ввод с консоли, но как только я начинаю вводить несколько чисел в массив, он говорит, что возникла ошибка Exception 7. (Неверный адрес данных)

Вот код, который я использую перед запуском подпрограммы, которая считывает числа из консоли с помощью read_array:

la $a0, bIntro_p
li $v0, 4
syscall

li $a0, 0 #reset
li $a1, 0 #reset

li $v0, 5
syscall
move $t0, $v0 #moves length into $t0 for allocation, keeps length there

li $v0, 9 #allocation, sets base address into $v0
move $a0, $t0
syscall #base address is now in $v0
move $t1, $v0 #base now in $t1

move $a0, $t0 #length ($t0) goes into $a0 before reading
move $a1, $t1 #base address ($t1) goes into $a1 before reading

jal read_array

Я знаю, что в передаче аргументов есть много лишних команд перемещения, но в основном это связано с устранением неполадок. Из того, что я узнал, динамические массивы должны хранить свои базовые адреса в $v0 после запуска системного вызова 9, верно? (Только месяц назад начал изучать MIPS.)

Вот подпрограмма для read_array:

read_array:
# Read words from the console, store them in
# the array until the array is full
li $t0, 0
li $t1, 0

move $t0, $a0 #length
move $t1, $a1 #base address
li $t9, 0 #makes sure count is reset before engaging
sw $t1, myBaseHolder #save the base address into the holder word

rWhile:

bge $t9, $t0, endR #branch to end if count > length

li $v0, 5 #call for an int from console
syscall

sw $v0, 0($t1) #saves the word from the console into the array

addiu $t9, $t9, 1 #count++
addiu $t1, $t1, 4 #increments the address
b rWhile

endR:

jr $ra

Странная часть заключается в том, что этот код отлично работает для статического массива, который я должен выделить ранее в программе, но динамический массив, кажется, ломает мой код, и я не могу сказать, связано ли это с тем, что я не передаю правильные значения к подпрограмме или потому, что подпрограмма ошибочна с самого начала.

Для более подробного изучения структур передачи аргументов подпрограмм я загрузил весь свой код программы в Pastebin здесь . Любое понимание будет супер оценено!


person rollerz    schedule 01.03.2015    source источник


Ответы (1)


Ваша программа обрабатывает динамически размещаемый массив так, как будто его емкость (или длина, как вы это называете) равна количеству выделенных байтов, т. е. как если бы элементы, которые вы сохраняете в массиве, были по одному байту каждый.
Но вы не записывает байты в массив; вы пишете слова по 4 байта каждое. Поэтому, когда вы запрашиваете у пользователя длину массива, вам нужно умножить полученное число на 4, прежде чем выполнять распределение, поскольку количество байтов, необходимое для вашего массива, равно length * 4.

person Michael    schedule 02.03.2015