Assembly x86汇编如何使用DIV指令和循环检查整数是否为素数
我创建了一个程序,它将打印用户输入的所有素数。但是,有些输出值不是素数,如15、21等。如果我以15开始程序,它将不会以素数输出,因此它必须是我的DIV段或循环。非常感谢您的帮助Assembly x86汇编如何使用DIV指令和循环检查整数是否为素数,assembly,x86,intel,irvine32,Assembly,X86,Intel,Irvine32,我创建了一个程序,它将打印用户输入的所有素数。但是,有些输出值不是素数,如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
.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。检查素数时更改iStart
,但下次检查时不会将其重置回3。相关:风格和效率。当你知道除数是2的幂时,千万不要使用div。你肯定不需要在内存中保留除数;使用登记册;这就是他们的目的。相关:风格和效率。当你知道除数是2的幂时,千万不要使用div。你肯定不需要在内存中保留除数;使用登记册;这就是他们的目的。