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

内嵌汇编实现2-100素数最大间隔查找程序输出错误求助

故障定位与修正方案

核心错误点

  • 除数未重置(根源性错误)
    素性检测需要从2开始逐个试除,但代码仅在初始化时给divisor赋值2,完成一个数的检测后从未将divisor重置为2,直接进入下一个数的检测。
    流程上,上一个数检测完成时divisor必然等于上一个待检测数,下一个数试除时会直接从n-1开始,自增1后触发cmp ebx, number相等分支,直接判定n为素数,完全跳过试除逻辑,所有数都会被误判为素数。
  • 最大间隔对应素数对的存储逻辑反转
    进入prime分支后,代码先备份旧的firstPrime、secondPrime,再用新检测到的素数覆盖这两个值;计算出新间隔后,只要新间隔不大于当前max,就立刻用备份的旧值恢复firstPrime、secondPrime。
    由于所有误判的“素数”都是连续整数,间隔恒为1,始终不超过初始max=1,因此firstPrime、secondPrime永远停留在最初的{2,3},输出固定不变。
  • 初始值冗余导致无效流程
    初始时latestPrime已经设为第一个素数2,number也被设为2,第一次循环会直接进入prime分支计算2与自身的间隔0,属于无意义操作。
  • 标签大小写不匹配
    代码中定义了notPrime标签,但跳转指令写为je notprime(小写p),部分编译器会因大小写不区分可以通过,但属于不规范写法,容易引发编译异常。

关键修正点

  1. 每次进入外层循环处理新数前,将divisor重置为2,确保试除从最小除数开始。
  2. 调整素数对存储逻辑:仅当新间隔大于当前max时,才将当前素数对赋值给firstPrime、secondPrime,否则保留已有的最大间隔对应的素数对,取消无意义的备份恢复流程。
  3. 调整初始值:number初始化为3,firstPrime、secondPrime初始化为2,latestPrime初始化为2,跳过对2的冗余检测。
  4. 统一标签大小写,确保跳转指令与标签定义完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 10:06:04