【问题标题】:Storing Matrices from console in MIPS Assembly在 MIPS 程序集中从控制台存储矩阵
【发布时间】:2017-10-15 02:28:30
【问题描述】:

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

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

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

这是我目前的代码(我正在使用 QTSimp 运行它):

.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

【问题讨论】:

    标签: matrix mips memory-alignment


    【解决方案1】:

    大致上,你需要指定对齐方式:

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

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

    尽管您不要求进行代码审查,但我应该警告您,您为每个矩阵保留 9 字节,而不是 字数。 这只是意味着您的代码可能会溢出,因为在下面的代码中您为每个元素地址添加了4 字节偏移量。

    【讨论】:

    • 哦,我没有意识到我正在存储字节(我对 mips 很陌生)。由于我存储了 9 个字节,因此我将其更改为 .space 36,现在它可以完美运行。非常感谢!
    • 不客气。 > Oh I did not realize that I was storing bytes > 准确地说 - 只是用正确的术语来说 - 你在存储 words ,因为你使用了sw 指令。但是存储空间不足以包含 9 个字(9 个字节而不是 36 个字节)。所以现在你已经辨别出来了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多