素数程序错误(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
。
这个程序有一点小错误。这是一个简单的程序,允许用户输入大于 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
。