📄 clock.asm
字号:
;余彪 计算机2班 25号
DATA SEGMENT
BUF DB 'the time is :','$' ;设置提示文字
TBUF DB 10 DUP(?) ;设置存放余数的缓冲区
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CALL CLRSCR ;清屏
MOV AH,2 ;输出缓冲区的文字
SUB BH,BH
MOV DX,081CH
INT 10H
MOV DX,OFFSET BUF ;DOS9号调用输出文字
MOV AH,9
INT 21H
LOP : CALL SETCURS ;主程序,设置光标位置,输出时间
MOV AH,2CH ;调用系统时间
INT 21H
PUSH DX ;DX中的时间秒和百分秒入栈
MOV DL,CH
MOV DH,0
CALL BIN10OUT ;调用二进制转十进制输出时间小时
MOV DL,':'
MOV AH,2
INT 21H
MOV DL,CL
MOV DH,0
CALL BIN10OUT ;输出时间分钟
MOV DL,':'
MOV AH,2
INT 21H
POP DX ;秒和百分秒出栈
MOV DL,DH
MOV DH,0
CALL BIN10OUT ;输出时间秒
MOV AH,0BH ;调用0BH号中断,若有输入字符,则退出程序
INT 21H
CMP AL,0FFH
JNZ LOP ;循环输出每个当前时间
MOV AH,4CH
INT 21H
CLRSCR PROC ;清屏子程序
PUSH AX
PUSH BX
MOV AX,0600H ;AL=0整个窗口空白
MOV BH,0FH
SUB CX,CX ;左上角行号,列号
MOV DX,184FH ;右下角行号,列号
INT 10H
POP BX
POP AX
RET
CLRSCR ENDP
SETCURS PROC ;设置光标位置
PUSH AX
PUSH BX
PUSH DX
MOV AH,2 ;调用BIOS2号中断
SUB BH,BH
MOV DX,0A24H ;在第0页中定位
INT 10H
POP DX
POP BX
POP AX
RET
SETCURS ENDP
BIN10OUT PROC ;二进制转十进制ASCUII码输出子程序
PUSH DI
PUSH DX
PUSH CX
PUSH AX
MOV CX,0
LEA DI,TBUF ;去缓冲区首地址
BIN1: PUSH CX
MOV AX,DX
MOV DX,0
MOV CX,10
DIV CX ;AX内容除以DX内容,商在AX,余数在DX
XCHG AX,DX ;交换AX,DX的内容
ADD AL,30H ;余数加30H,入栈准备输出
MOV [DI],AL
INC DI
POP CX
INC CX ;累加每调用一次要输出的位数
CMP DX,0 ;商和0比较
JNZ BIN1 ;不等于0转BIN1
CMP CX,1 ;累加器和1比较
JNZ BIN2 ;不等于1转BIN2
MOV AH,2 ;等于1位,先在改位前输出0
MOV DL,'0'
INT 21H
BIN2: DEC DI ;等于0输出十进制数的各位
MOV AL,[DI]
CALL STDOUT
LOOP BIN2
POP AX ;恢复现场
POP CX
POP DX
POP DI
RET
BIN10OUT ENDP
STDOUT PROC ;标准输出子程序
PUSH DX
MOV DL,AL
MOV AH,2
INT 21H
POP DX
RET
STDOUT ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -