素数程序错误(MASM)

Prime numbers program error (MASM)

这个程序有一点小错误。这是一个简单的程序,允许用户输入大于 2 的数字并确定它是否为素数。对于 3 和 4 的数字,它工作正常。据说 3 不是质数,而 4 是质数。我只是展示计算代码。

;ecx = divisor, esi = max divisor, edx = remainder, eax = quotient

mov ebx, eax
shr eax, 1
mov esi, eax   ;Max divisor value
mov ecx, 1

 isPrime:
      inc ecx
      cmp ecx, esi
      je Prime

      mov edx, 0
      mov eax, ebx
      div ecx
      cmp edx, 0
      jz NotPrime

      jmp isPrime

我不确定 shr 是否与错误有关。有什么解释吗?我试图避免只为这些值进行跳跃。

感谢您的宝贵时间。

je Prime 是错误的。 ESI 的值是 EAX 的一半(向下舍入)。如果 EAX 为 3,则 ESI 将变为 1。 ECX 有效地从 2 开始(mov ecx, 1 inc ecx)。因此它将在等于 ESI 之前遍历整个 32 位范围。当 ECX 变为 3 时,循环将中断到 NotPrime.

如果EAX==4,循环将立即中断到Prime:第一个ECX是2,ESI是2。

补救措施:将 je Prime 更改为 ja Prime