在 QTSPIM 中 运行 代码时获取内存越界异常
Getting Memory out of bounds exception while running code in QTSPIM
我正在尝试一个数组来保存 i * j 个值并打印数组中的值。
我有两个循环 loop1,loop2,其中 loop1 接受 i,loop2 接受 j。
我正在尝试将 i * j 保存在 space 数据类型的 myarray 中。
我遇到异常内存地址越界并且无法找到错误所在。
.data
myarray: .space 10000
n: .word 1
space_line: .asciiz " "
new_line: .asciiz "\n"
.text
.globl main
main:
lw $a0, n
la $a1, myarray
li $a2, -1 #row
li $t0, 0
li $t2, 0
loop1:
addi $a2, $a2,1
bge $a2, $a0, print_loop
li $a3, 0 #column
j loop2
loop2:
bge $a3, $a0, loop1
#multiply a2 and a3
mul $t1, $a2, $a3
sw $t1, 0($a1)
addu $a1, $a1,4
addi $a3, $a3,1
j loop2
print_loop:
mul $t3, $a0, $a0
bge $t0, $t3, exit
li $v0, 4
lw $a0, myarray($t2)
syscall
li $v0, 4
lw $a0, space_line
syscall
rem $t4, $t3, $a0
beqz $t4, newline
addu $t2, $t2, 4
addi $t0, $t0, 1
j print_loop
newline:
li $v0, 4
lw $a0, myarray($t2)
syscall
exit:
# Done, terminate program.
li $v0, 10
syscall # all done!
.end main
对于 n =4,我期望控制台中的输出为
0 0 0 0
0 1 2 3
0 2 4 6
0 4 8 12
您可以通过在调试器中单步执行来发现这个问题。从尽可能小的输入开始,如您显示的 n=1
。在每条指令之后,验证它做了你想要的,并且除了你想要的之外它没有做任何其他事情。
提示:注意la
和lw
的区别。此外,如果您想将系统调用放在代码或循环的中间,请避免为您自己的变量使用 $a0
和 $v0
寄存器——这只会让事情变得 easier/better.
我正在尝试一个数组来保存 i * j 个值并打印数组中的值。
我有两个循环 loop1,loop2,其中 loop1 接受 i,loop2 接受 j。 我正在尝试将 i * j 保存在 space 数据类型的 myarray 中。
我遇到异常内存地址越界并且无法找到错误所在。
.data
myarray: .space 10000
n: .word 1
space_line: .asciiz " "
new_line: .asciiz "\n"
.text
.globl main
main:
lw $a0, n
la $a1, myarray
li $a2, -1 #row
li $t0, 0
li $t2, 0
loop1:
addi $a2, $a2,1
bge $a2, $a0, print_loop
li $a3, 0 #column
j loop2
loop2:
bge $a3, $a0, loop1
#multiply a2 and a3
mul $t1, $a2, $a3
sw $t1, 0($a1)
addu $a1, $a1,4
addi $a3, $a3,1
j loop2
print_loop:
mul $t3, $a0, $a0
bge $t0, $t3, exit
li $v0, 4
lw $a0, myarray($t2)
syscall
li $v0, 4
lw $a0, space_line
syscall
rem $t4, $t3, $a0
beqz $t4, newline
addu $t2, $t2, 4
addi $t0, $t0, 1
j print_loop
newline:
li $v0, 4
lw $a0, myarray($t2)
syscall
exit:
# Done, terminate program.
li $v0, 10
syscall # all done!
.end main
对于 n =4,我期望控制台中的输出为
0 0 0 0
0 1 2 3
0 2 4 6
0 4 8 12
您可以通过在调试器中单步执行来发现这个问题。从尽可能小的输入开始,如您显示的 n=1
。在每条指令之后,验证它做了你想要的,并且除了你想要的之外它没有做任何其他事情。
提示:注意la
和lw
的区别。此外,如果您想将系统调用放在代码或循环的中间,请避免为您自己的变量使用 $a0
和 $v0
寄存器——这只会让事情变得 easier/better.