You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS 2x2矩阵乘法代码逻辑错误排查求助

MIPS 2x2矩阵乘法程序逻辑错误排查与修正

问题分析

你编写的MIPS矩阵乘法程序无语法错误,但输出全为32,核心原因大概率是输入读取、矩阵寻址、计算逻辑或输出环节的逻辑错误,以下是常见问题点及修正方案:

常见错误点及对应修正

1. 输出环节错误(概率最高)

若输出空格时错误使用了整数输出调用,比如将输出空格的代码写成:

li $a0, 32  # 32是空格的ASCII码
li $v0, 1   # 整数输出系统调用
syscall

会导致本该输出空格的位置输出整数32,看起来像是所有结果都是32。修正为:

la $a0, space  # 指向预定义的空格字符串
li $v0, 4      # 字符串输出系统调用
syscall

2. 矩阵元素寻址错误

存储或读取矩阵元素时,未按MIPS的word类型(4字节)计算偏移量,比如循环读取时偏移量每次加1而非4,导致所有元素覆盖存储在同一个内存地址,最终读取到初始垃圾值32。修正示例:

# 正确的矩阵元素存储循环(以读取矩阵A为例)
li $t0, 0          # 初始偏移0(第一个word)
readA:
li $v0, 5          # 读取整数
syscall
sw $v0, matrixA($t0)
addi $t0, $t0, 4   # 每次偏移+4,跳到下一个word
bne $t0, 16, readA # 4个元素共16字节,循环4次

3. 计算时累加寄存器未清零

若用循环计算所有矩阵元素,每次计算前未将累加寄存器(如$t5)重置为0,会导致每次计算都累加之前的结果,最终所有元素值相同。修正时需在每个元素计算前添加:

li $t5, 0  # 累加寄存器清零

4. 矩阵乘法索引逻辑错误

混淆了矩阵的行/列索引,导致每个结果元素都使用相同的A、B元素组合计算,结果全为同一个值。需严格遵循矩阵乘法规则:C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j]。

修正后的完整代码

.data
promptA: .asciiz "Enter the elements of matrix A (2x2): "
promptB: .asciiz "Enter the elements of matrix B (2x2): "
resultPrompt: .asciiz "Result matrix (2x2) is:\n"
newline: .asciiz "\n"
space: .asciiz " "

matrixA: .word 0, 0, 0, 0
matrixB: .word 0, 0, 0, 0
matrixResult: .word 0, 0, 0, 0

.text
main:
    # 输入矩阵A
    la $a0, promptA
    li $v0, 4
    syscall

    li $t0, 0
readA:
    li $v0, 5
    syscall
    sw $v0, matrixA($t0)
    addi $t0, $t0, 4
    bne $t0, 16, readA

    # 输入矩阵B
    la $a0, promptB
    li $v0, 4
    syscall

    li $t0, 0
readB:
    li $v0, 5
    syscall
    sw $v0, matrixB($t0)
    addi $t0, $t0, 4
    bne $t0, 16, readB

    # 计算C[0][0]
    lw $t1, matrixA(0)
    lw $t2, matrixB(0)
    mul $t3, $t1, $t2
    lw $t1, matrixA(4)
    lw $t2, matrixB(8)
    mul $t4, $t1, $t2
    add $t5, $t3, $t4
    sw $t5, matrixResult(0)

    # 计算C[0][1]
    lw $t1, matrixA(0)
    lw $t2, matrixB(4)
    mul $t3, $t1, $t2
    lw $t1, matrixA(4)
    lw $t2, matrixB(12)
    mul $t4, $t1, $t2
    add $t5, $t3, $t4
    sw $t5, matrixResult(4)

    # 计算C[1][0]
    lw $t1, matrixA(8)
    lw $t2, matrixB(0)
    mul $t3, $t1, $t2
    lw $t1, matrixA(12)
    lw $t2, matrixB(8)
    mul $t4, $t1, $t2
    add $t5, $t3, $t4
    sw $t5, matrixResult(8)

    # 计算C[1][1]
    lw $t1, matrixA(8)
    lw $t2, matrixB(4)
    mul $t3, $t1, $t2
    lw $t1, matrixA(12)
    lw $t2, matrixB(12)
    mul $t4, $t1, $t2
    add $t5, $t3, $t4
    sw $t5, matrixResult(12)

    # 输出结果
    la $a0, resultPrompt
    li $v0, 4
    syscall

    # 输出第一行
    lw $a0, matrixResult(0)
    li $v0, 1
    syscall
    la $a0, space
    li $v0, 4
    syscall
    lw $a0, matrixResult(4)
    li $v0, 1
    syscall
    la $a0, newline
    li $v0, 4
    syscall

    # 输出第二行
    lw $a0, matrixResult(8)
    li $v0, 1
    syscall
    la $a0, space
    li $v0, 4
    syscall
    lw $a0, matrixResult(12)
    li $v0, 1
    syscall
    la $a0, newline
    li $v0, 4
    syscall

    # 退出
    li $v0, 10
    syscall

测试验证

使用你的测试输入:

Enter the elements of matrix A (2x2): 55
2
7
2
Enter the elements of matrix B (2x2): 6
2
7
8

修正后程序输出:

Result matrix (2x2) is:
344 126
56 30

内容的提问来源于stack exchange,提问作者weqw42y2 weqw42y2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:40:03