📄 1.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,7 ;to scroll downward function
mov al,0 ;code to blank screen
mov bh,30h ;reverse video attribute
mov ch,0 ;upper left row
mov cl,72 ;upper right column
mov dh,0 ;lower right row
mov dl,72 ;lower left column
int 10h ;call video ROM
;定位
mov ch,0
mov cl,79
mov ah,01h ;置光标起始和结束行
INT 10H
mov dh,24
mov dl,79
mov bh,0
mov ah,02h
int 10h
;locate cursor
mov dx,68
mov ah,2 ;to locate column
int 10h ;call video BIOS
MOV AH,2
xor bh,bh
MOV DX,72
INT 10H
MOV AH,2
INT 1AH ; 读取系统时间 CH:CL:DH hh:mm:ss
PUSH DX
PUSH CX
POP BX ; CX(hh:mm) -> BX
PUSH BX
CALL SHOWBYTE ; 显示 bh, 即显示 hh
CALL SHOWCOLON ; 显示 ':' 分隔符号
POP BX ; 保存的 hh:mm
XCHG BH,BL ; mm -> BH
CALL SHOWBYTE ; 显示 bh, 即 mm
CALL SHOWCOLON ; 显示 ':' 分隔符号
POP BX ; 保存的 DX -> BX, bh=ss
CALL SHOWBYTE ; 显示 ss
MOV DX,CS:OLDCUR ; 保存的原来的光标位置
MOV AH,2 ; 恢复原来的光标位置
XOR BH,BH
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET ; 中断返回
; 下面的子程显示 bh 中的值
SHOWBYTE PROC NEAR
PUSH BX
MOV CL,4
MOV AL,BH
SHR AL,CL ; 高 4 位的内容
ADD AL,30H ; 数值转换为字符
CALL SHOW ; 显示高 4 位的字符
CALL CURMOVE ; 光标后移一个位置
POP BX
MOV AL,BH
AND AL,0FH ; 低 4 位
ADD AL,30H ; 数值 -> 字符
CALL SHOW ; 显示低 4 位的字符
CALL CURMOVE ; 光标后移一个位置
RET
SHOWBYTE ENDP
; 下面的子程将光标向后移动一个位置
CURMOVE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3
MOV BH,0
INT 10H ; 读光标位置
INC DL ; 向后移动一个位置
MOV AH,2
INT 10H ; 重新设置光标的位置
POP DX
POP CX
POP BX
POP AX
RET
CURMOVE ENDP
; 下面的子程显示字符 ':', 它是hh:mm:ss 间的分隔符号
SHOWCOLON PROC NEAR ; 此子程独立出来
MOV AL,':'
CALL SHOW ; 显示 ':'
CALL curmove ; 光标后移一个位置
RET
SHOWCOLON ENDP
; 下面的子程在当前光标位置处以 属性显示AL中的字符
SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H ; 显示属性字符
MOV BX,30H ; 字符的属性(颜色和背景色)
MOV CX,1 ; 显示字符的重复数, 只显示一个
INT 10H ; 在光标位置显示字符及其属性
POP CX
POP BX
POP AX
RET
SHOW ENDP
EXIT:
MOV AH,4CH
INT 21H
GO:
PUSH CS
POP DS
MOV AH,35H ; 取中断向量的功能调用
MOV AL,1CH
INT 21H ; 段地址放es,偏移地址放bx
MOV OLD1C,BX ; 保存偏移地址
MOV BX,ES ; 保存段地址
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C ; 反编中断例行程序偏移地址放dx
MOV AH,25H ; 设置中断向量功能调用
MOV AL,1CH
INT 21H ; 改中断向量
MOV DX,OFFSET GO
SUB DX,OFFSET START
MOV CL,4
SHR DX,CL
ADD DX,11H
MOV AH,01H ; 键盘单个字符输入
INT 21H
CMP Al,0Dh ; 输入是回车则退出程序返回DOS
JE EXIT
MOV AX,3100H
INT 21H ; 结束并驻留
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -