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
相关产品推荐
相关产品推荐

