在屏幕上交替显示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