📄 os2-3.asm
字号:
.386
code segment use16
assume cs:code
count db 8
hour1 db '0'
hour2 db '0'
db ':'
min1 db '0'
min2 db '0'
db ':'
sec1 db '0'
sec2 db '0'
buf_len=$-hour1 ;计算显示信息长度
cur dw ? ;原光标位置
old_int dw ?,? ;原int 1ch的中断矢量
start: jmp init
new1ch proc far
pushf
call dword ptr cs:old_int
pushad
push ds
push es
mov ax,cs ;将ES,DS指向CS
mov ds,ax
mov es,ax
mov ah,3 ;获取0号显示页面当前的光标位置
mov bh,0
int 10h
mov cur,dx ;保存原光标位置
mov bp,offset hour1 ;es:[bp]指向显示信息的起始位置
mov bh,0
mov dh,0
mov dl,80-buf_len
mov bl,7 ;显示字符的属性(白色)
mov cx,buf_len ;显示字符串长度
mov al,0 ;bl包含显示属性,写后光标不变
mov ah,13h ;调用显示字符串的功能
int 10h ;在右上角显示当前时间
mov bh,0 ;对0号页面操作
mov dx,cur ;恢复原来的光标位置
mov ah,2 ;设置光标位置的功能号
int 10h ;还原光标位置(保证主程序的光标位置
;不受影响)
pop es
pop ds
popad ;恢复现场
iret ;中断返回
new1ch endp
init: mov ah,35h ;保存原中断向量
mov al,1ch
int 21h
mov old_int,bx
mov old_int+2,es
mov ax,cs
mov ds,ax
mov ah,2ch ;获取时间
int 21h
mov al,ch ;小时转换成ASCII码
mov ah,0
mov bl,10
div bl
add ah,30h
mov hour2,ah
mov ah,0
div bl
add ah,30h
mov hour1,ah
mov al,cl ;分钟转换成ASCII码
mov ah,0
div bl
add ah,30h
mov min2,ah
mov ah,0
div bl
add ah,30h
mov min1,ah
mov al,dh ;秒转换成ASCII码
mov ah,0
div bl
add ah,30h
mov sec2,ah
mov ah,0
div bl
add ah,30h
mov sec1,ah
lea dx,new1ch ;设置新的中断向量
mov ah,25h
mov al,1ch
int 21h
mov cl,4
lea dx,init+15
shr dx,cl
add dx,10h
mov al,0
mov ah,31h
int 21h
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -