Assembly 在汇编中打印素数
我试图在汇编中打印1-100之间的素数,但我的代码不仅打印出额外的数字,而且还排除了一些素数 以下是我的主要程序:Assembly 在汇编中打印素数,assembly,printing,x86,primes,Assembly,Printing,X86,Primes,我试图在汇编中打印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 isPrim
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
mov最小值,1
循环启动:
股份有限公司;闵++
mov-eax,min
cmp-eax,max;比较2和100
下一步;除非2小于100,否则跳转
称为isPrime;检查是否为素数
cmp-ecx,0
jne loopStart
推送eax
调用printPrime;打印素数
波普eax
jmp循环启动
下一个:;一旦最大值为100
推0
呼叫退出过程
我的iPrime是:
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
mov素数,0;设为真
mov-ecx,prime
mov-k,2;重置k
mov-edx,0;清除edx
div num;n/2
mov-edx,0;再次清除edx
开始:
cmp-ecx,0;在黄金时期
jne;如果素数不是真的
cmp-eax,k;k您没有在isPrime
中的循环内正确重置EDX
。也就是说,在divk
之前,您需要放置mov-edx,0
或xor-edx,edx
另外,我不确定函数(?)开头的divnum
中的num
来自哪里。注释中说你被2除,那么你的意思是divk
你的程序中有一些不必要的代码。就像这张支票:
cmp ecx, 0 ; while prime
jne E ; if prime isnt true
如果您查看代码的其余部分,应该可以清楚地看到,ECX
在该点上的值永远不会超过零。当您在k=k+1处增加k时,您忘记了清除edx到目前为止您做了哪些调试?您是否尝试过在调试器中单步执行它,以查看当它报告不正确的素数时发生了什么?