我正在尝试分配动态数组并让它接受来自控制台的输入,但是一旦我开始在数组中输入一些数字,它就会出现异常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
我知道传递的参数有很多多余的移动命令,但这主要来自故障排除。根据我的了解,动态数组应该在运行syscall 9之后将它们的基地址存储在$ v0中吗? (刚开始学习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 here。任何洞察都会非常感激!
答案 0 :(得分:0)
您的程序将动态分配的数组视为其容量(或您调用的长度)等于分配的字节数,即您在数组中保留的元素各自为一个字节。
但是你没有把字节写入数组;你正在写单词,每个单词是4个字节。因此,当您提示用户获取数组长度时,您需要在分配之前将得到的数字乘以4,因为数组所需的字节数为length * 4
。