📄 源码.asm
字号:
code segment ;代码段
assume cs:code,ds:code
start:
jmp go
oldcur dw ?
OLD1C DW 2 DUP(?)
NEWINT1C:
PUSHF ;标志进栈
CALL DWORD PTR CS:OLD1C
push ax
PUSH BX
PUSH CX
PUSH DX
XOR BH,BH ;异或,清零
MOV AH,3 ;读取光标位置
INT 10H
MOV CS:OLDCUR,DX
MOV AH,2 ;2号功能调用,置光标位置
xor bh,bh
MOV DX,45h
INT 10H
MOV AH,2 ;读取系统时钟 出口参数分别CH:CL:DH
INT 1AH
PUSH DX
PUSH CX
POP BX
PUSH BX
CALL SHOWBYTE ;调用 SHOWBYTE,显示小时 (转换成ASC码输出)
CALL SHOWCOLON ;调用 SHOWCOLON 显示:
POP BX
XCHG BH,BL ;数据交换
CALL SHOWBYTE ; 显示分钟 (转换成ASC码输出)
CALL SHOWCOLON ; 显示 :
POP BX
CALL SHOWBYTE ;显示秒
MOV DX,CS:OLDCUR ;保存原来光标位置
MOV AH,2 ;恢复原光标位置
XOR BH,BH
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
SHOWBYTE PROC NEAR
PUSH BX
MOV CL,4
MOV AL,BH
SHR AL,CL ;bx 进栈,高4位放cl中,al 右移4位
ADD AL,30H ;转换成 ASC码
CALL SHOW ;调 SHOW
CALL CURMOVE ;调CURMOVE (光标后移一个位置)
POP BX
MOV AL,BH
AND AL,0FH ;与,屏蔽高4位,显示低4位
ADD AL,30H ;数值转换成ASC码
CALL SHOW ;显示
CALL CURMOVE ;光标后移
RET
SHOWBYTE ENDP
SHOWCOLON PROC NEAR ;(:显示)
MOV AL,':' ; : 放入AL中
CALL SHOW
CALL CURMOVE
RET
SHOWCOLON ENDP
CURMOVE PROC NEAR ;光标后移一个位置
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3 ;INT10 3号功能调用读光标位置
MOV BH,0 ;设置显示方式
INT 10H
INC DL ;加1指令
MOV AH,2 ;置光标位置
INT 10H
POP DX
POP CX
POP BX
POP AX ;出栈
RET ;返回
CURMOVE ENDP
SHOW PROC NEAR ;显示
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H ;显示字符串
MOV BX,2fh ;INT10 的1号功能调用,显示光标类型字符颜色属性
MOV CX,1
INT 10H
POP CX
POP BX
POP AX
RET ;中断返回
SHOW ENDP
GO:
PUSH CS
POP DS
MOV Ah,35H ;读取中断向量,出口参数BX
mov AL,1CH
INT 21H ;段地址放 ES,偏移地址放BX
MOV OLD1C,BX ;保存偏移地址
MOV BX,ES ;保存段地址
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C
MOV Ah,25H ;设置新的中断向量 ds:dx al=中断类型号
MOV AL,1CH
INT 21H
MOV DX,OFFSET GO ;定义GO的偏移地址
SUB DX,OFFSET START
MOV AH,07H ;键盘接收字符,07号调用无回显
INT 21H
CMP AL,0DH ;与输入回车比较,相等跳转至clear(清屏)
JE CLEAR
MOV AX,31H ;终止并驻留
INT 21H
clear:
MOV AH,0FH ;取当前显示方式
INT 10H
MOV AH,00H ;设置显示方式
INT 10h
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -