如何解决在某个区间 [a,b]
我的程序有问题,它应该在某个区间 [a,b] 中打印素数。目前它无法正常工作,但我想我已经接近了。我认为可能问题出在我的堆栈操作上,这就是它不起作用的原因。我对吗?或者也许是别的什么?也许有人和我有类似的问题?
MOV ax,[a] ; ax = start of interval,a = start,b = end of interval
MOV bx,2 ; bx = 2 (for primes)
petlap1: ; loop for i = a; i <= b; i++
CMP ax,[b] ; a > b ? END
JA start
MOV bx,2 ; starting from j = 2
MOV bp,1 ; boolean flag: 1 - "i" is prime,0 - "i" is not prime
petlap2: ; loop for j = 2; j < i; j++
; MOV dx,ax
; SUB dx,1
CMP bx,ax ; i == j,then check if "i" is prime
JE czypierwsza
XOR dx,dx
MOV cx,ax ; save "i" to cx
DIV bx ; check for prime
CMP dx,0 ; "i" is not prime
JE niejest
MOV ax,cx ; restore "i"
ADD bx,1 ; increment "j"
JMP petlap2 ; continue "j" loop
czypierwsza: ; is "i" prime?
CMP bp,1 ; 1 - it is,0 - it is not
JE konw ; if it is then convert it to string for output
JMP zwieksz ; if it is not then increase "i" and continue "i" loop
zwieksz:
ADD ax,1
JMP petlap1
niejest: ; "i" is not a prime,set bp flag to 0 and jump to check if it is prime (I know it is not the best way)
MOV bp,0
JMP czypierwsza
konw: ; convert "i" to string for further output
MOV [i],ax ; restore "i" to variable [i]
XOR cx,cx ; cx = 0,I use cx for counting items on stack
petstr:
MOV bx,10 ; for division
XOR dx,dx ; dx = 0
DIV bx ; dx = digit,ax = quotient
PUSH dx ; push digit onto stack
INC cx ; increment cx (how many items are on stack)
CMP ax,0 ; is this last digit of a number? if so go convert "i" to string for output
JE dokonw
JMP petstr ; if not then continue pushing digits onto stack
dokonw:
MOV si,2 ; si for writing to array of characters
JMP petkonw ; go write "i" to array
petkonw: ; write to array
CMP cx,0 ; is there any digit on the stack?
JE wyp ; there is none (I assume input is normal)
POP ax ; get digit from stack
ADD al,48 ; make it ASCII character
MOV [istr+si],al ; write it to an array
DEC cx ; decrement cx
INC si ; increment si to next position in an array
JMP petkonw ; continue conversion
wyp: ; print out prime
MOV ah,9
MOV dx,ent ; some enter for formatting
INT 21h
MOV ah,istr+2 ; print out prime
INT 21h
MOV ax,[i] ; restore "i" for next iteration
ADD ax,1 ; increment it
JMP petlap1 ; start next iteration of "i" loop
似乎对于每个间隔 [a,b]
,我的程序都会打印“3”并永远循环。对于 [20,40]
,它打印“31”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。