【中断程序】int 9中断例程
思路:
(1)编写子程序连续显示a~z
(2)显示一个字符后,让字符停留几秒再显示下一个字符
(3)不安装int 9中断例程,而是直接修改向量表。(修改int 9向量表前要设置IF=0,修改后要设置IF=1)
(4)在修改向量表之前要保存原有int 9例程的地址
(5)在自定义的中断例程中,需要调用BIOS的int 9,为此必须手动模拟硬件过程
assume cs:code
stack segment
db 16 dup(0)
stack ends
data segment
dw 0,0
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
mov es,ax
mov ax,data
mov ds,ax
push es:[9*4]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
cli
mov word ptr es:[9*4],offset int9
mov word ptr es:[9*4+2],cs
sti
call show
cli
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
sti
mov ax,4c00h
int 21h
show:
push ax
push es
mov ax,0b800h
mov es,ax
mov ah,'a'
s:
mov es:[160*12+40*2],ah
call delay
inc ah
cmp ah,'z'
jna s
pop es
pop ax
ret
; 通过多次的减法运算实现等待几秒的效果
delay:
push dx
push ax
mov dx,10h
mov ax,0
dsub:
sub ax,1
sbb dx,0
cmp dx,0
jne dsub
cmp ax,0
jne dsub
pop ax
pop dx
ret
;----------------------------
int9:
push ax
push es
in al,60h
; 手动模拟硬件过程,IF、TF已经为0,不再设置
pushf
call dword ptr ds:[0] ; BIOS的int 9结束时会iret,因此需要手动pushf
cmp al,1
jne int9_ret
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+40*2+1]
int9_ret:
pop es
pop ax
iret
code ends
end start