Files
2026-06-25 00:09:09 +08:00

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