www.pudn.com > kcsj.rar > shiyan2.asm


LF	equ	0ah		;换行16进制码 
CR	equ	0dh		;回车16进制码 
DATAS SEGMENT 
    ;此处输入数据段代码 
    Msg1	db	'please input N(between 1 and 9)= ','$' 
	Msg2	db	CR,LF,'Error:Your input is not legal ','$' 
	Msg3	db	CR,LF,'output ','$'     
DATAS ENDS 
 
STACKS SEGMENT 
    ;此处输入堆栈段代码 
STACKS ENDS 
 
CODES SEGMENT 
    ASSUME CS:CODES,DS:DATAS,SS:STACKS 
START: 
    MOV AX,DATAS 
    MOV DS,AX 
    ;此处输入代码据段代码 
    LEA	DX,Msg1 
    CALL	Puts 
    CALL INPUT 
    CMP AL,'#' 
    JZ OVER 
    CMP AL,'1'	;进行1-9范围的判断 
    JB INPUT_ERRORS	;如果输入不在1-9之间则跳到 
					;INPUT_ERRORS 
    CMP AL,'9' 
    JA	 INPUT_ERRORS 
    CLC 
    AND AL,0FH; 
	 
    MOV CL,AL 
     
	 
LOOP1:	;主程序实现部分 
	CALL DISPLAY 
	DEC	CX 
	CALL DELAY2 
	CMP CX,0 
	JNZ LOOP1 
	CALL CRLF	;调用打印回车换行 
	JMP START	;跳转到程序开头执行 
INPUT_ERRORS:	;输入不在1-9之间,打印错误信息 
	LEA	DX,Msg2 
	CALL	Puts 
	CALL	CRLF 
	JMP START	;跳转到程序开始处 
	 
OVER:	;按#结束	 
    MOV AH,4CH 
    INT 21H 
     
INPUT PROC	;从键盘输入一个字符 
    MOV AH,1H 
    INT 21H 
    RET 
INPUT ENDP 
 
     
DISPLAY PROC	;显示过程 
    MOV AH,02H 
    MOV DL,07H 
    INT 21H	;响铃一次 
     
    MOV AL,02H 
    MOV DL,2AH 
    INT 21H	;送*到显示器 
    RET 
DISPLAY ENDP   
 
DELAY1 PROC	;延迟过程 
	PUSH CX 
	MOV BX,30000	;	;使用嵌套延迟 
LOOPDOT1: 
	MOV CX,65535; 
LOOPDOT2: 
	DEC CX 
	JNZ	LOOPDOT2 
	DEC BX 
	CMP BX,0 
	JA	LOOPDOT1 
	POP CX 
    RET 
DELAY1 ENDP  
 
DELAY2 PROC	;时钟延迟过程方式 
		  PUSH	DS 
          MOV   AX,   0    
          MOV   DS,   AX    
          MOV   AX,   DS:[046ch]    ;时钟计数器,每次时钟中断时自动加1。 
;系统启动时,其值为从午夜到现在的时钟中断数。当其计数达24小时时,则被置为0, 
;并且将0000:0470H的字节置为1 
          ADD   AX,   37  
  WAIT2S:    
          CMP   AX,   DS:[046ch]    
          JA   WAIT2S 
          POP	DS 
          RET 
DELAY2 ENDP  
 
Puts	proc 
;入口参数:ds:dx = 输入缓冲区首地址 
;功能,向显示器输出一个字符串,存入以ds:dx所指的缓冲区 
;说明:对缓冲区格式的要求同int 21h的9号功能 
	push	 ax 
	mov	ah,9 
	int	21h 
	pop	ax 
	ret 
Puts	endp 
 
CRLF PROC	;打印回车换行过程 
    MOV AH,2 
    MOV DL,0DH 
    INT 21H 
     
    MOV DL,0AH 
    INT 21H 
    RET 
CRLF ENDP 
 
CODES ENDS 
    END START