主题:[原创]<交流>TSR示例程序-截获时钟中断
一直不明白什么是 “截获时钟中断”,在网上也找不到此类完整的汇编程序。
反复调试,自己动手编写了一个基本完整的。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; TSR示例程序
; by ccpp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; TSR.asm
; 截获时钟中断1ch。安装新的子程序,并驻留内存
; 24行67列开始输出字符ccpp,每隔0.5s改变字符颜色
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; masm6.11编译和链接:
; ml TSR.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.model tiny
.386
.code
lpcharmode equ 0b800h ; 字符模式的段地址
;lpcharmode equ 0b000h ; 笔记本电脑 字符模式的段地址
ORG 100h ; 起始点100h,是com文件
start:
jmp setup ; 跳转到TSR的安装部分的代码
; --------------- (驻留内存的代码)------------------------
int8_handler PROC far
sti ; 允许硬件中断
pushf ; 保存标志寄存器
push ax
push bx
push es
;************************************
inc count
mov ax,count
cmp ax,9 ;每秒18.2次中断
jb @end
mov count,0
inc color
mov al,color
cmp al,15
jbe @f
mov color,1
@@:
mov bx,lpcharmode;
mov es,bx
mov al, 'c'
;窗口大小80列×25行,其中行24,列64,
;3974 =(80×24+64)×2。
;前一个字节保存字符,后一个字节保存颜色
mov es:[3974],al;
mov al, color
mov es:[3975],al;
mov al, 'c'
mov es:[3976],al;
mov al, color
mov es:[3977],al;
mov al, 'p'
mov es:[3978],al;
mov al, color
mov es:[3979],al;
mov al, 'p'
mov es:[3980],al;
mov al, color
mov es:[3981],al;
;***************************************
@end: pop es
pop bx
pop ax
popf
jmp cs:[old_interrupt8] ;跳转到原来的处理例程
color byte 1
count word 0
old_interrupt8 DWORD ?
;iret
int8_handler ENDP
; --------------- (驻留代码结束) ------------------
;=================安装部分的代码====================
setup:
mov ax,351ch ;获取原中断(1ch)
int 21h ;处理例程的
mov word ptr old_interrupt8,bx ;偏移值和
mov word ptr old_interrupt8+2,es;段值
mov ax,251ch ;安装新中断处理例程
mov dx,offset int8_handler ;偏移值
;mov ax,seg int8_handler
;mov ds,ax ;com文件不用再设置ds
int 21h
mov dx,offset setup ; 终止并驻留
int 27h
END start
反复调试,自己动手编写了一个基本完整的。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; TSR示例程序
; by ccpp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; TSR.asm
; 截获时钟中断1ch。安装新的子程序,并驻留内存
; 24行67列开始输出字符ccpp,每隔0.5s改变字符颜色
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; masm6.11编译和链接:
; ml TSR.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.model tiny
.386
.code
lpcharmode equ 0b800h ; 字符模式的段地址
;lpcharmode equ 0b000h ; 笔记本电脑 字符模式的段地址
ORG 100h ; 起始点100h,是com文件
start:
jmp setup ; 跳转到TSR的安装部分的代码
; --------------- (驻留内存的代码)------------------------
int8_handler PROC far
sti ; 允许硬件中断
pushf ; 保存标志寄存器
push ax
push bx
push es
;************************************
inc count
mov ax,count
cmp ax,9 ;每秒18.2次中断
jb @end
mov count,0
inc color
mov al,color
cmp al,15
jbe @f
mov color,1
@@:
mov bx,lpcharmode;
mov es,bx
mov al, 'c'
;窗口大小80列×25行,其中行24,列64,
;3974 =(80×24+64)×2。
;前一个字节保存字符,后一个字节保存颜色
mov es:[3974],al;
mov al, color
mov es:[3975],al;
mov al, 'c'
mov es:[3976],al;
mov al, color
mov es:[3977],al;
mov al, 'p'
mov es:[3978],al;
mov al, color
mov es:[3979],al;
mov al, 'p'
mov es:[3980],al;
mov al, color
mov es:[3981],al;
;***************************************
@end: pop es
pop bx
pop ax
popf
jmp cs:[old_interrupt8] ;跳转到原来的处理例程
color byte 1
count word 0
old_interrupt8 DWORD ?
;iret
int8_handler ENDP
; --------------- (驻留代码结束) ------------------
;=================安装部分的代码====================
setup:
mov ax,351ch ;获取原中断(1ch)
int 21h ;处理例程的
mov word ptr old_interrupt8,bx ;偏移值和
mov word ptr old_interrupt8+2,es;段值
mov ax,251ch ;安装新中断处理例程
mov dx,offset int8_handler ;偏移值
;mov ax,seg int8_handler
;mov ds,ax ;com文件不用再设置ds
int 21h
mov dx,offset setup ; 终止并驻留
int 27h
END start