📄 tsr时钟.txt
字号:
我自己编写了一个TSR的小时钟, 但是发现驻留后再卸载, 卸载后使用mem查看, 发现clock已经不在了, 然后再次运行, 然后使用mem查看, 发现有两分clock, 再卸载clock, 并使用mem
查看,发现剩下还有一个clock. 为什么?
;dos 小时钟程序
code segment
assume cs:code, ds:code, ss:code
org 100h
start:
jmp install
flag db 'INT1CH',0
old1ch dw 0, 0
int1ch:
push ax
push cx
push bx
push dx
push ds
mov ax, 0b800h
mov ds,ax
mov cx, 8
xor bx, bx
lop1:
inc bx
mov [bx], byte ptr 1fh
inc bx
loop lop1
mov ah,2
int 1ah
mov ah,cl
mov cl, 4
mov al, ch
shr al, cl
add al,30h
mov ds:[0], al
mov al, ch
and al, 0fh
add al, 30h
mov ds:[2], al
mov ds:[4], byte ptr ':'
mov al, ah
shr al, cl
add al,30h
mov ds:[6], al
mov al,ah
and al, 0fh
add al, 30h
mov ds:[8], al
mov ds:[10], byte ptr ':'
mov al, dh
shr al, cl
add al, 30h
mov ds:[12], al
mov al, dh
and al, 0fh
add al, 30h
mov ds:[14], al
pop ds
pop dx
pop bx
pop cx
pop ax
iret
uninstall:
push ds
push es
push cs
pop ds
cli
mov ax,251ch
mov dx, old1ch
mov cx, old1ch+2
mov ds, cx
int 21h
sti
mov ax, cs:[2ch]
mov es, ax
mov ax, 4900h
int 21h ;释放环境块内存
mov ax, cs
mov es, ax
mov ax, 4900h
int 21h ;释放程序主体内存
pop es
pop ds
retf
install:
mov ax, 351ch
int 21h
mov old1ch, bx
mov old1ch+2, es ;保存int 1ch的向量
lea si, flag
mov di, bx
sub di, int1ch-flag
cld
mov cx, 6
lop:
cmpsb
jnz nequal
loop lop ;验证是否已经安装该程序
jmp equal
nequal: ;没有安装就安装
push ds
push cs
pop ds
cli
lea dx, int1ch
mov ax, 251ch
int 21h
sti
pop ds
mov ah,9
lea dx, err_msg2
int 21h ;显示安装信息
mov ax,3100h
lea dx, install
mov cl,4
shr dx,cl
inc dx
int 21h
equal: ;说明已经安装了, 应该卸载
add old1ch, uninstall-int1ch ;计算卸载程序的入口
call dword ptr old1ch
lea dx, err_msg
mov ah,9
int 21h
int 20h ;结束程序
err_msg db 'Clock uninstalled!$',0
err_msg2 db 'Clock installed!$',0
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -