110 lines
1.8 KiB
NASM
110 lines
1.8 KiB
NASM
; 实验九 - 读取时间程序
|
|
; 功能: 使用INT 1AH读取系统时间
|
|
; 模式: 文本模式 80x25 彩色
|
|
|
|
.MODEL SMALL
|
|
.DATA
|
|
TIME_MSG DB 'Current system time: ', '$'
|
|
HOUR_DB '00', ':', '$'
|
|
MIN_DB '00', ':', '$'
|
|
SEC_DB '00', '$'
|
|
CRLF DB 0DH, 0AH, '$'
|
|
|
|
.CODE
|
|
.STARTUP
|
|
MOV AX, @DATA
|
|
MOV DS, AX
|
|
|
|
MAIN_LOOP:
|
|
; 获取系统时间 (INT 1AH, AH=00H)
|
|
MOV AH, 00H
|
|
INT 1AH
|
|
; CX:DX 中包含时钟滴答数
|
|
; CX = 高位, DX = 低位
|
|
|
|
; 将滴答数转换为 时:分:秒
|
|
; 系统时钟每秒约18.2个滴答
|
|
; 或者使用 INT 1AH, AH=02H 读取BCD格式的时间
|
|
|
|
; 读取时间 (AH=02H)
|
|
MOV AH, 02H
|
|
INT 1AH
|
|
; DL = 日, DH = 时, CL = 分, CH = 秒
|
|
|
|
; 转换小时
|
|
MOV AL, DH
|
|
CALL BIN_TO_BCD
|
|
MOV [HOUR_DB], AH
|
|
MOV [HOUR_DB+1], AL
|
|
|
|
; 转换分钟
|
|
MOV AL, CL
|
|
CALL BIN_TO_BCD
|
|
MOV [MIN_DB], AH
|
|
MOV [MIN_DB+1], AL
|
|
|
|
; 转换秒
|
|
MOV AL, CH
|
|
CALL BIN_TO_BCD
|
|
MOV [SEC_DB], AH
|
|
MOV [SEC_DB+1], AL
|
|
|
|
; 清除屏幕
|
|
MOV AX, 0600H
|
|
MOV BH, 07H
|
|
MOV CX, 0000H
|
|
MOV DX, 184FH
|
|
INT 10H
|
|
|
|
; 设置光标位置
|
|
MOV AH, 02H
|
|
MOV BH, 0
|
|
MOV DH, 10
|
|
MOV DL, 30
|
|
INT 10H
|
|
|
|
; 显示 "Current system time: "
|
|
LEA DX, TIME_MSG
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
; 显示时间
|
|
LEA DX, HOUR_DB
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
LEA DX, MIN_DB
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
LEA DX, SEC_DB
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
; 延时
|
|
MOV CX, 0
|
|
MOV DX, 0
|
|
MOV AH, 86H
|
|
INT 15H
|
|
|
|
JMP MAIN_LOOP
|
|
|
|
.EXIT
|
|
|
|
; 子程序: 将AL中的二进制数转换为BCD码
|
|
; 输入: AL = 二进制数 (0-99)
|
|
; 输出: AH = 高位BCD, AL = 低位BCD
|
|
BIN_TO_BCD PROC
|
|
PUSH DX
|
|
MOV AH, 0
|
|
MOV DL, 10
|
|
DIV DL
|
|
; AL = 商 (高位), AH = 余数 (低位)
|
|
MOV DL, AH
|
|
MOV AH, AL
|
|
MOV AL, DL
|
|
POP DX
|
|
RET
|
|
BIN_TO_BCD ENDP
|
|
|
|
END |