素数程序错误(MASM)

时间:2015-10-24 06:05:26

标签: assembly primes division 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是否可能与错误有关。有什么解释吗?我试图避免为这些值跳转。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

je Prime错了。 ESI的值是EAX的一半(向下舍入)。如果EAX为3,则ESI将变为1. ECX有效地启动2(mov ecx, 1 inc ecx)。因此它将在整个32位范围内循环,然后它将等于ESI。当ECX变为3时,循环将中断为NotPrime

如果EAX == 4,则循环将立即分解为Prime:第一个ECX为2,ESI为2。

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