我有以下代码来查找素数:
isPrime PROC; checks if a number is prime by dividing out values less than it until it finds one that has a remainder of 0
;or the test value reaches the number
retest:
inc testNum
mov eax, testPrime
cmp eax, testNum
je prime
mov edx, 0
mov eax, testPrime
mov ebx, testNum
div ebx
cmp edx, ZERO
jg retest
mov eax, 1
mov testNum, eax
inc testPrime
prime:
ret
isPrime ENDP
它的工作方式是testPrime是被测试的数字。然后检查testNum,它从2开始(开始时为1但立即递增)并将testPrime除以testNum。如果余数为零,则它除以,testPrime不是素数。 testPrime递增,testNum重置,整个事情再次开始。如果testPrime和testNum相等,则它是一个素数,并且该过程退出(这会导致程序的另一部分打印它,并在增加testPrime后再次调用该过程)。
正在发生的是它正在打印从2开始的每个整数,但是请求的质数很多。我做了一些调试,似乎edx在某种程度上得到了一个非常大的数字,但我不知道如何。
答案 0 :(得分:0)
管理修复它。由于我调试断点的位置不佳,我没有意识到edx寄存器正在被正确使用。但是,我的代码中还存在另外两个问题。
工作代码如下。注意在prime:标记之前的新jmp命令,以及在返回之前新的testNum重置。
isPrime PROC; checks if a number is prime by dividing out values less than it until it finds one that has a remainder of 0
;or the test value reaches the number
retest:
inc testNum
mov eax, testPrime
cmp eax, testNum
je prime
mov edx, 0
mov eax, testPrime
mov ebx, testNum
div ebx
mov eax, edx
cmp eax, ZERO
jg retest
mov eax, 1
mov testNum, eax
inc testPrime
jmp retest
prime:
mov eax, 1
mov testNum, eax
ret
isPrime ENDP
答案 1 :(得分:0)
data segment
ddd db 00h,00h,00h
ends
stack segment
dw 128 dup(0)
ends
code segment
proc zzz
push ax
push dx
push bx
lea di,ddd
mov bx,10
div bl
mov ds:[di+2],ah
add ds:[di+2],48
mov ah,0
div bl
mov ds:[di+1],ah
add ds:[di+1],48
mov ah,0
div bl
mov ds:[di],ah
add ds:[di],48
mov ah, 2
mov dx,ds:[di]
int 21h
mov dx,ds:[di+1]
int 21h
mov dx,ds:[di+2]
int 21h
pop bx
pop dx
pop ax
ret
endp
start:
mov ax,@data
mov ds,ax
mov es,ax
mov si,03d
mov di,50d
wwww:mov ax,si
mov bp,si
sub bp,2
mov bx,01h
mov cx,2
fff:mov dx,00h
push ax
div cx
pop ax
cmp dx,00
je sss
jmp con1
sss:mov bx,00h
con1:inc cx
dec bp
jnz fff
cmp bx,01h
je xxxx
jne mmmm
xxxx:call zzz
mmmm:inc si
cmp si,50d
je bbb
jmp wwww
bbb:ends
ends
end start