Опитвам се да разпределя динамичен масив и да го накарам да приеме въвеждане от конзолата, но след като започна да въвеждам няколко от числата в масива, той казва, че има грешка 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 тук . Всяко прозрение ще бъде много оценено!