📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -