Грешка в динамичния масив на 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 след изпълнение на syscall 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