在 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 的倍数。在您的情况下 0x10010009
(MatrixB
开始)不是 4
.[=21= 的倍数]
虽然你不要求代码审查,但我应该警告你,你保留 9
bytes,而不是 words 每个矩阵的内存。
这仅仅意味着您的代码可能会溢出,因为在下面的代码中,您为每个元素地址添加了 4
字节偏移量。
我试图在 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 的倍数。在您的情况下 0x10010009
(MatrixB
开始)不是 4
.[=21= 的倍数]
虽然你不要求代码审查,但我应该警告你,你保留 9
bytes,而不是 words 每个矩阵的内存。
这仅仅意味着您的代码可能会溢出,因为在下面的代码中,您为每个元素地址添加了 4
字节偏移量。