在此程序中出现轻微错误。这是一个简单的程序,允许用户输入一个高于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
是否可能与错误有关。有什么解释吗?我试图避免为这些值跳转。
感谢您的时间。
答案 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
。