1

我有以下用于查找素数的代码:

   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 以某种方式获得了一个非常大的数字,但我不知道如何。

4

2 回答 2

0

设法修复它。由于我的调试断点位置不佳,我没有意识到 edx 寄存器正在被正确使用。但是,我的代码中还存在另外两个问题。

工作代码如下。注意在 prime: 标记之前的新 jmp 命令,以及在 return 之前对 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
于 2013-08-04T21:27:12.147 回答
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
于 2014-01-13T11:50:44.367 回答