; 安裝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