;主要想法是开一个count(我这里设为50000)大小的数组,数组元素的值(1/0)表示数组下标 index+1 是否为素数。
include io.inc
.model small
.stack
.data
count=50000 ;定义素数的范围
array db count dup(0) ;创建一个大小为count的数组,全部置为0
.code
.startup
mov array[0],1 ;将第一个置为1,1作为一个标志,把非素数对应的元素值标记为1
mov cx,count
mov si,0 ;si可以看作是元素下标,遍历array数组,
L1:
push cx
cmp array[si],1
je L1end ;若si指向的元素值为1,si指针继续往下走
push si ;否则该元素就是素数
push cx
mov dl,20h ;输出空格
mov ah,2
int 21h
mov ax,si
inc ax ;ax=si+1,ax是素数
call dispuiw
pop cx
pop si
mov di,si ;di=si,di往下扫描将si对应元素的倍数对应的位置全部置为1
mov dx,0 ;dx=0
L2:
inc dx ;dx和di一起往下走
inc di
cmp dx,ax ;当dx=ax时,di对应的元素就是si对应元素的倍数
je L3
L4:
cmp di,49999 ;判断di是否扫描到了数组尽头
jb L2
jmp L1end ;内循环结束,继续外循环
L3: ;将array[di]置为1,dx=0,jmp L4 继续往下扫描
mov array[di],1
mov dx,0
jmp L4
L1end:
pop cx
inc si
loop L1
.exit
end