在屏幕上交替顯示a~z,按ESC字體變綠色
assume cs:code,ds:data
data segment
dw 0,0;存放原9號中斷的偏移和段地址
data ends
code segment
;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;
start:
;安裝9號中斷
mov bx,data
mov ds,bx
mov bx,0
mov es,bx
mov ax,es:[9*4]
mov ds:[0],ax
mov ax,es:[9*4+2]
mov ds:[2],ax
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
mov bx,0b800h
mov es,bx
jmp restore
s: mov es:[160*12+2*70],al
call delay
cmp al,'z'
je restore
inc al
jmp s
mov ax,4c00h
int 21h
restore:
mov al,'a'
jmp s
delay:
push ax
push bx
mov ax,2000h
mov bx,0
s1: sub bx,1
sbb ax,0
cmp ax,0
jne s1
cmp bx,0
jne s1
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;
;9號中斷
;;;;;;;;;;;;;;;;;
int9:
push ax
in al,60h
cmp al,1
jne int9_rtn
mov byte ptr es:[160*12+2*70+1],00000010b
int9_rtn:
;模擬中斷髮生過程
pushf;保存標誌寄存器內容
;設置標誌寄存器的IF,TF爲0
pushf
pop ax
and ah,1100b
push ax
popf
call dword ptr ds:[0];完成push cs,push ip
pop ax
iret
code ends
end start