; 安装do0子程序,处理中断0
; do0 子程序代替0号中断,在屏幕中间显示"overflow!! dyl'"
assume cs:code
code segment
start:
; 用movsb安装do0 到0号中断向量
; 配置好movsb要用到的源地址 ds:[si] 开始
mov ax, cs
mov ds, ax
mov si, offset do0
; 目的地址 为 es:[di] 开始
mov ax, 0
mov es, ax
mov di, 200h
; 代码长度,两个标号之间相减为代码的长度
mov cx, offset do0end - offset do0
cld
rep movsb
; 设置中断向量表
; 0中断的段地址为 0*4+2
; 0中断的偏移地址为 0*4
mov ax, 0
mov es, ax
mov word ptr es:[0*4], 200h
mov word ptr es:[0*4+2], 0h
mov ax, 4c00h
int 21h
do0:
; 因为此程序退出时,内存会被操作系统收回,所以这里定义一个数据,放在不会被OS收回的内存里
jmp short do0start
db 'overflow!! dyl'
do0start:
mov ax, cs
mov ds, ax
; 因为拷贝了代码到0:200之后,数据是从202h 地址开始开始的,jmp short do0start 占了2个字节
mov si, 202h
; 拷贝到显存的中间位置
mov ax, 0b800h
mov es, ax
mov di, 12*160+36*2
mov cx, 14
s:
; 从 ds:[si] 开始的
mov al, [si]
mov es:[di], al
inc si
add di, 2
loop s
mov ax, 4c00h
int 21h
iret
do0end: nop
code ends
end start