; 重写并覆盖中断0的中断处理程序
; 参考and练习 with 王爽-汇编程序-12章内中断
; By Jian
;
assume cs:code
code segment
; 安装新的"中断处理程序"到中断向量表
start: mov ax, 0h ; 指向目标
mov es, ax
mov di, 0200h ; 0000:0200h 到 0000:0300h是一个空闲区,我们把中断处理程序放这里了
mov ax, code ; 指向代码源
mov ds, ax
mov si, offset IH
mov cx, offset IHend - offset IH ; 拷贝源到目标
cld
rep movsb
mov ax, 0h ; 设置中断向量表
mov es, ax
mov word ptr es:[0], 0200h + offset IHCode - offset IH
mov word ptr es:[2], 0h
mov ax,1000h ; 使得除法溢出, 并立即调用新的中断处理程序,13章补:可以用int 0 指令直接触发中断处理程序
mov bh,1
div bh
mov ax,4c00H
int 21H
; 中断0(除法溢出)处理程序, IH为入口点,只是简单的在屏幕中显示一段文字
IH: db 'Interrupt 0(div overflow) handle by Jian'
IHCode: mov ax, 0B800h ; 大约在屏幕中间(全屏幕).
mov es, ax
mov bx, 80 * 13 + 10
mov ax, 0h ; 指向显示文字
mov ds, ax
mov si, 0200h
mov ah, 24h ; 绿底红字
mov cx, offset IHCode - offset IH ; 循环次数
sLoop: mov al, [si]
mov es:[bx], ax
add bx, 2
inc si
loop sLoop
mov ax,4c00H ; 直接返回到操作系统,因此这里的中断处理程序不需要保存寄存器.
int 21H
IHend: nop
code ends
end start