MIPS汇编质数检测代码故障排查:非质数误判为质数
MIPS质数检测代码故障排查与修正
核心故障原因
- 除法操作数顺序错误:原代码中
div $t1, $t0是将初始值为2的t1除以输入值t0,但我们需要判断的是输入值t0能否被t1整除,正确指令应为div $t0, $t1,这样HI寄存器才会存储t0 % t1的余数。 - 循环逻辑缺失:
prime_check块执行一次判断后,没有跳转回检查逻辑继续循环,直接流入prime_true分支,导致仅做一次判断就结束。 - 错误修改目标变量:原代码用
addi $t0, $t0, 1修改了输入值t0,但实际应递增的是除数t1(从2开始逐步检查),输入值需保持不变用于后续判断。
修正后的代码
.data is_prime: .asciiz "--Prime--" not_prime: .asciiz "--No prime--" element: .word 2 .text main: # 加载结果提示信息地址 la $t3, is_prime la $t4, not_prime lw $t1, element # t1 作为除数,初始值为2 # 读取用户输入的数字 li $v0, 5 syscall move $t0, $v0 # t0 存储输入的目标数字n # 处理特殊情况:n=1不是质数 beq $t0, 1, prime_false # 仅当n>1时进入质数检查逻辑 bgt $t0, 1, prime_check prime_check: # 优化判断:若除数的平方大于n,说明无因数,直接判定为质数 mul $t2, $t1, $t1 # 计算t1的平方存入t2 bgt $t2, $t0, prime_true div $t0, $t1 # 计算n除以t1,余数存入HI寄存器 mfhi $t6 beq $t6, 0, prime_false # 余数为0,说明能被整除,不是质数 addi $t1, $t1, 1 # 除数加1,继续检查下一个可能的因数 j prime_check # 跳转回检查逻辑,循环执行 prime_true: li $v0, 4 move $a0, $t3 syscall j exit prime_false: li $v0, 4 move $a0, $t4 syscall j exit exit:
关键修正说明
- 调整
div指令操作数顺序,确保计算输入值与除数的余数,正确判断整除性。 - 添加
j prime_check实现循环检查,遍历所有可能的除数。 - 将递增对象改为除数
t1,保留输入值t0的原始值用于判断。 - 加入平方判断优化,减少不必要的循环次数(若存在大于
sqrt(n)的因数,必然对应一个更小的因数,无需继续检查)。
内容的提问来源于stack exchange,提问作者Lykoto
相关产品推荐
相关产品推荐

