[英]Printing Prime Numbers in Assembly
我正在尝试从汇编中的1-100打印素数,但是我的代码不仅打印出多余的数,而且还排除了一些素数。
这是我的主要步骤:
mov min, 1
loopStart:
inc min ; min++
mov eax, min
cmp eax, max ; compare 2 and 100
je next ; jump unless 2 < 100
call isPrime ; check if prime
cmp ecx, 0
jne loopStart
push eax
call printPrime ; print the prime numbers
pop eax
jmp loopStart
next: ; once max is 100
push 0
call ExitProcess
我的isPrime是:
mov prime, 0 ; set as true
mov ecx, prime
mov k, 2 ; reset k
mov edx, 0 ; clear edx
div num ; n/2
mov edx, 0 ; clear edx again
start:
cmp ecx, 0 ; while prime
jne E ; if prime isnt true
cmp eax, k ; k<=n/2
jl E
mov eax, min
div k
cmp edx, 0 ; check for remainder
jne kAdd
mov prime, 1 ; set as false
jmp E
kAdd:
inc k
jmp start
E:
mov ecx, prime
mov eax, min
ret
isPrime endp
它打印出:2 3 5 7 13 15 19 21 25 31 33 37 39 43 49 51 55 57 61 63 67 73 75 79 81 85 91 93 97 99
事实是,大多数额外数字都可以被3、5和7(都是质数)整除吗?
您没有在isPrime
的循环内正确重置EDX
。 也就是说,在div k
之前,您需要放置mov edx,0
或xor edx,edx
。
另外,我不确定在函数(?)开头div num
中num
来源。 评论说您要除以2,那么您的意思是div k
吗?
而且程序中有一些不必要的代码。 像这样检查:
cmp ecx, 0 ; while prime
jne E ; if prime isnt true
如果您看一下其余的代码,则应该清楚的是, ECX
在那一点永远不会有除零以外的任何其他值。
当您在k = k + 1处增加k时,会忘记清除edx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.