问题
求100以内的素数。
要求:
(1)以十进制输出这些素数,每行10个,每输出一个素数都要有数秒的停顿。
(2)统计这些素数的个数,以十进制形式输出。
(3)计算这些素数之和,以十进制形式输出,并让该和闪烁3次。
(4)数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(5)要使用到子程序。
代码
data segment
count dw 0;存放素数个数
sum dw 0;存放素数的和
prime dw 100 dup(?);存放素数
primemsg db 'print prime',0ah,0dh,'$';输出素数的提示信息
countmsg db 0ah,0dh,'print prime of count',0ah,0dh,'$';输出素数个数提示
summsg db 0ah,0dh,'print prime of sum',0ah,0dh,'$' ;输出素数和提示
blank db ' $'
data ends
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
stack segment
dw 20 dup(?)
stack ends
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
code segment
assume cs:code,ds:data,ss:stack
main proc far;主程序
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
call caculate
call disprime
call dispcount
call dispsum
mov ax,4c00h
int 21h
main endp
;------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------
caculate proc near;判断素数的子程序
lea di,prime;将prime的偏移地址送入di
mov bh,0
mov bl,2;bl从2到100递增
l1:
cmp bl,100
ja l2
mov dl,2;dl从2到bl-1
l3:
cmp dl,bl;j<i
jae l4
mov ax,bx
div dl
cmp ah,0
jz l5;余数为0,则不是素数
inc dl
jmp l3
l4:
inc count
add sum,bx
mov [di],bl
inc di
l5:
inc bl
jmp l1
l2:
ret
caculate endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
disprime proc near
lea dx,primemsg
mov ah,09h
int 21h
lea si,prime
mov cx,count
l21:
mov ax,count
sub ax,cx;loop一次,cx--,所以可以用ax和cx的差作为判断依据
mov bl,10
div bl
cmp ah,0
jnz l22;余数不为0说明不需要换行
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
l22:
mov bl,[si];从si中取出数据
mov bh,0;保证数据的稳定
call disp10
call delay
inc si;si指向下一个素数
loop l21
ret
disprime endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
dispcount proc near
lea dx,countmsg
mov ah,09h
int 21h
mov bx,count
call disp10;
call delay
ret
dispcount endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
dispsum proc near
lea dx,summsg
mov ah,09h
int 21h
push cx
mov cx,3
lp:
mov bx,sum
call disp10;十进制输出
call delay
mov ah,02h;回车符
mov dl,0dh
int 21h
lea dx,blank
mov ah,09h
int 21h
mov ah,02h
mov dl,0dh
int 21h
call delay;延时
loop lp
mov bx,sum
call disp10
pop cx
ret
dispsum endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
disp10 proc near;该子程序的作用是将BX中的数以十进制形式输出
push cx
push si
mov cx,0
mov ax,bx
disp10_l1:
mov dx,0;余数在dx里
mov si,10
div si
add dx,30h
push dx;将商一个一个压栈
inc cx
cmp ax,0
jnz disp10_l1
disp10_l2:
pop dx;将每个十进制数字弹出
mov ah,02h
int 21h
loop disp10_l2
pop si
pop cx
mov ah,02h
mov dl,20h
int 21h
ret
disp10 endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
delay proc near
push cx
push ax
mov ax,1000d
ld1:
mov cx,200d
ld2:
loop ld2
dec ax
jnz ld1
pop ax
pop cx
ret
delay endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
code ends
end start