一直不明白什么是 “截获时钟中断”,在网上也找不到此类完整的汇编程序。
反复调试,自己动手编写了一个基本完整的。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 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