x86 汇编如何使用 DIV 指令和循环来检查整数是否为素数
x86 Assembly how to use DIV instruction and loop to check if integer is prime
我创建了一个程序,可以打印用户输入的所有质数。但是,一些输出值不是质数,例如 15、21 等。如果我以 15 开始程序,它不会将其输出为质数,因此它必须是我的 DIV 段或循环。非常感谢任何帮助。
.code
main proc
mov ecx, 18 ;ecx is the loop counter
mov eax, 2 ;assume 2 is prime
L1:
inc eax ;start with value 3
call isPrime
loop L1
invoke ExitProcess,0
main endp
isPrime PROC ;Procedure
push eax
push ecx
mov valEntered, eax
mov ogCounter, ecx
mov edx, 0 ;check if
;value divisible by 2
mov eax, eax
div divisor0 ;divisor0 = 2
mov eax, edx
cmp eax, 0
jz no
mov ecx, valEntered ;ecx loop
;counter
L2: ;check if
;value divisible by >= 3
mov eax, iStart ;iStart = 3
mul iStart
cmp valEntered, eax
jl yes
mov edx, 0
mov eax, valEntered
div iStart ;iStart = 3
mov eax, edx
cmp eax, 0
jz no
add iStart, 2 ;iStart += 2
loop L2
jmp no
yes: ;output prime number
mov eax, valEntered
call WriteInt
call Crlf
mov ecx, ogCounter
pop ecx
pop eax
ret
no: ;continue to next int
mov ecx, ogCounter
pop ecx
pop eax
ret
isPrime ENDP
end main
您在检查质数时更改了 iStart
,但在下一次检查时从未将其重置回 3。
我创建了一个程序,可以打印用户输入的所有质数。但是,一些输出值不是质数,例如 15、21 等。如果我以 15 开始程序,它不会将其输出为质数,因此它必须是我的 DIV 段或循环。非常感谢任何帮助。
.code
main proc
mov ecx, 18 ;ecx is the loop counter
mov eax, 2 ;assume 2 is prime
L1:
inc eax ;start with value 3
call isPrime
loop L1
invoke ExitProcess,0
main endp
isPrime PROC ;Procedure
push eax
push ecx
mov valEntered, eax
mov ogCounter, ecx
mov edx, 0 ;check if
;value divisible by 2
mov eax, eax
div divisor0 ;divisor0 = 2
mov eax, edx
cmp eax, 0
jz no
mov ecx, valEntered ;ecx loop
;counter
L2: ;check if
;value divisible by >= 3
mov eax, iStart ;iStart = 3
mul iStart
cmp valEntered, eax
jl yes
mov edx, 0
mov eax, valEntered
div iStart ;iStart = 3
mov eax, edx
cmp eax, 0
jz no
add iStart, 2 ;iStart += 2
loop L2
jmp no
yes: ;output prime number
mov eax, valEntered
call WriteInt
call Crlf
mov ecx, ogCounter
pop ecx
pop eax
ret
no: ;continue to next int
mov ecx, ogCounter
pop ecx
pop eax
ret
isPrime ENDP
end main
您在检查质数时更改了 iStart
,但在下一次检查时从未将其重置回 3。