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

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:

关键修正说明

  1. 调整div指令操作数顺序,确保计算输入值与除数的余数,正确判断整除性。
  2. 添加j prime_check实现循环检查,遍历所有可能的除数。
  3. 将递增对象改为除数t1,保留输入值t0的原始值用于判断。
  4. 加入平方判断优化,减少不必要的循环次数(若存在大于sqrt(n)的因数,必然对应一个更小的因数,无需继续检查)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:31:09