汇编实验判断素数
实验4.2 判断素数
1(
目:找出前100个素数。
2( 实验要求:将前100个素数找出并显示值,要求每行显示5个素数。 3( 提示:有很多方法可以判断素数,下面给出了其中一种方法的伪代码。
prime[1] := 2; {第一个素数数字}
prime[2] := 3; {第二个素数数字}
primeCount := 2;
candidate := 4; {新素数的第一个candidate }
while primeCount < 100 loop
index := 1;
while (index ? primeCount)
and (prime[index]不能除尽candidate)loop
加 1到 index;
end while;
if (index > primeCount)
then {不存在素数能除尽candidate, 所以它是一个新的素数}
加1到primeCount;
prime[primeCount] := candidate;
end if;
加1到candidate;
end while;
display "Prime Numbers";
for index := 1 to 100 loop {每行显示5个素数}
display prime[index];
if index能被5除尽,则跳到新的一行;
end if;
end for;
.386
.MODEL FLAT
INCLUDE io.h
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
cr EQU 0dh
lf EQU 0ah
maxNbrs EQU 100
.STACK 4096
.DATA
PrimeCount DWORD ? ;计数素数的个数 candidate DWORD ?
index DWORD ?
temp DWORD ?
directions BYTE cr, Lf, "本程序将会打印出100个素数:",cr,lf,0 change BYTE cr, Lf,0 ;换行 nbrArray DWORD maxNbrs DUP (0)
outValue BYTE 11 DUP (?),0
endlabels BYTE cr,Lf,"程序结束~",0
.CODE
_start:
output directions
lea ebx,nbrArray
mov eax,2
mov [ebx],eax
add ebx,4
mov eax,3
mov [ebx],eax
add ebx,4
mov PrimeCount,2 ;计数素数的个数
mov candidate,4 ;从4开始判断素数
whileloop:
cmp PrimeCount,100
jnb endwhile ;当素数计数大于或等于100时跳转
mov ecx, 2 ;ecx寄存器存放除数,判断被除数是否为素数
whilefind:
cmp ecx,candidate
jnb endfind
mov eax,candidate
cdq
div ecx
cmp edx,0 ;edx寄存器存放的是余数
je endfind ;若余数等于0,则跳转
inc ecx
jmp whilefind
endfind:
cmp ecx,candidate
jne continue ;当除数不等于被除数,继续寻找,否则当前被除数为素数
mov eax,candidate
mov [ebx],eax
add ebx,4
inc PrimeCount
continue:
inc candidate
jmp whileloop
endWhile:
mov index,0
lea ebx,nbrArray
mov temp,5 ;计数每一行素数的个数
whileoutput:
cmp index,100
jnb endwhileoutput ;当打印的素数个数大于或等于100时,停止打印
dtoa outValue,[ebx]
output outValue
inc index
mov eax,index
cdq
div temp
cmp edx,0
jne continueOut
output change
continueOut:
add ebx,4
jmp whileoutput
endwhileoutput:
output endlabels
INVOKE ExitProcess, 0
PUBLIC _start
END