在 MIPS 汇编中从控制台存储矩阵

Storing Matrices from console in MIPS Assembly

我试图在 MIPS 中存储用户输入的两个 3x3 矩阵,以便最终我可以执行矩阵乘法。我可以很好地存储 MatrixA 但是当我尝试存储 MatrixB 时出现错误

Exception occurred at PC=0x00400060
Unaligned address in store: 0x10010009

我知道存在内存对齐问题,但我该如何解决?

到目前为止,这是我的代码(我正在使用 QTSpim 运行):

.data
matrixA: .space 9
matrixB: .space 9



.text

main: 
la $a1,matrixA  #load a pointer to array into $a1
la $a2,matrixB  #load pointer to array into $a2

addi $t1,$t1,9  #size of the array(matrix in array form)
addi $t3,$t3,9  

matA_loop: 
addi $t1,$t1,-1   #subtract 1 from $t1, save to $t1 
li $v0,5          #load 5 into $v0 (read integer) 
syscall           #input from user
sw $v0,0($a1)     #store input int to array 
addi $a1,$a1,4    #add 4 to $a1, save to $a1 
bnez $t1,matA_loop     #if $t1 isn't zero,goto loop 
la $a1,matrixA       #load array pointer into $a1 

matB_loop: 
addi $t3,$t3,-1   #subtract 1 from $t3, save to $t3
li $v0,5          #load 5 into $v0 (read integer) 
syscall           #prompt for input 
sw $v0,0($a2)     #store input int to array 
addi $a2,$a2,4    #add 4 to $a2, save to $a2 
bnez $t3,matB_loop     #if $t1 isn't zero,goto loop 
la $a2,matrixB       #load array pointer into $a1 

li $v0, 10
syscall

粗略地说,您需要指定对齐方式:

.data
.align 4
matrixA: .space 9
.align 4
matrixB: .space 9

此外,如果您在这两种情况下都使用大小 8 而不是 9,则无需指定 .align 即可。也许,您应该阅读一篇关于内存对齐的好文章,以便下次记住它。诀窍是您使用 sw ("store word") 指令存储一个 机器字 ,即 4 字节。因此,存储数据的内存地址必须是 4 的倍数。在您的情况下 0x10010009MatrixB 开始)不是 4.[=21= 的倍数]

虽然你不要求代码审查,但我应该警告你,你保留 9 bytes,而不是 words 每个矩阵的内存。 这仅仅意味着您的代码可能会溢出,因为在下面的代码中,您为每个元素地址添加了 4 字节偏移量。