請前輩們幫我看看這個源程序代碼。100以內的素數
這個代碼可以運行,但是不知道怎麼顯示結果……剛學彙編語言,所以很多地方都不精通。希望有前輩能指點一下。浪費您一點時間幫我看看這個代碼。
另有,裏面的子程序怎麼調用呢?謝謝!
源程序代碼:
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
push ax
lea dx,Str_Addr
mov ah,9
int 21h
pop ax
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov cs:@@Times,dx
mov cs:@@Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,cs:@@Times
sbb cx,cs:@@Times[2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret
@@Times dw 0,0
Delay EndP
; -------------------------------------
; 判断素数
; 入口参数:AL=256以内无符号整数
; 返回参数:若AL是素数,进位标志置位;否则,清位
Estimation Proc Near
push si
push cx
push ax
lea si,PrimeLess
cmp al,1
jz @@Not_Prime ;1不是素数
mov cx,4
@@Less_Prime: cmp al,[si]
jz @@Yes_Prime ;2、3、5、7是素数
inc si
loop @@Less_Prime
test al,1
jz @@Not_Prime ;除了2,其它偶数不是素数
lea si,PrimeLess[1]
mov cx,3
@@Divide357: push ax
div BYTE ptr [si]
test ah,ah
jnz $+5
pop ax
jmp @@Not_Prime
pop ax
inc si
loop @@Divide357
jmp $+5
@@Not_Prime: clc ;不是素数,清进位标志
jmp $+3
@@Yes_Prime: stc ;是素数,置进位标志
pop ax
pop cx
pop si
ret
PrimeLess db 2,3,5,7
Estimation EndP
; -------------------------------------
prompt_1 db 'These primes are:',13,10,'$'
prompt_2 db 13,10,13,10,'The primes: $'
prompt_3 db 13,10,13,10,'The sum of the primes: $'
Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds ;使数据段与代码段同段
push cs
pop es ;使附加段与代码段同段
Didas = 36 ;延时2秒
; -------------------------------------
;(1)以十进制输出这些素数,每行10个,每输出一个素数都要有数秒的停顿
Output prompt_1 ;提示显示素数
mov cx,99
xor bx,bx ;素数个数计数器
xor bp,bp ;素数之和初值
cld
PrimeSum: mov ax,100
sub ax,cx ;100以内的自然数
call Estimation ;判断素数子程序
jnc Next_One ;不是素数
inc bx ;素数计数
add bp,ax ;累加素数
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; call Delay ;延时2秒
mov dl,20h ;空一格
call Output_Chr ;显示输出一个字符
mov ax,bx
mov dl,10
div dl
test ah,ah
jnz $+5
call Output_CTLF ;显示输出一个回车、换行
Next_One: loop PrimeSum
; -------------------------------------
;(2)以十进制形式输出素数的个数
Output prompt_2 ;提示显示素数个数
mov ax,bx
call Dec_ASCII
; -------------------------------------
;(3)以十进制形式输出素数之和,并让该和闪烁3 次。
Output prompt_3 ;提示显示素数之和
xor bx,bx
mov ah,3 ;取光标位置
int 10h
mov ax,160
mul dh
shl dl,1
xor dh,dh
add ax,dx
inc ax
mov di,ax ;字符显示方式当前光标位置显示属性在显示缓冲区中的偏移地址
mov ax,bp
call Dec_ASCII
push es
mov ax,0b800h ;字符显示方式屏幕显示缓冲区段地址
mov es,ax
mov al,8dh ;字符显示属性
mov cx,4
cld
push di
Change_Attr1: stosb
inc di
loop Change_Attr1
Didas = 48 ;延时3秒
call Delay ;延时
pop di
mov al,7 ;字符显示属性
mov cx,4
Change_Attr2: stosb
inc di
loop Change_Attr2
pop es
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束