第二个重要的指令是IRET,从中断返回(Return from interrupt).IRET的功能和RET极相似,RET是用来从被调用 的子程序中返回,而IRET则是用来从中断程序返回.但是使用IRET返回时,它会从堆栈中先取出返回的地址值,然后再取出CPU的状态标志(State Flag).CPU的状态标志在CPU接受中断时,会自动地推入堆栈中.因此执行IRET指令后,CPU的状态就恢复成未中断前的状态;也就是说CPU就可以继续接受外界的中断(CPU状态标志中断包括了中断标志).严格地说,STI和IRET在这个例子中都是多余的,但是对于实际的中断处理程序而言,这两个指令都很重要.
另外,使用设置中断矢量的中断调用时,暂存器AL必须存入所要设置的中断矢量,而中断矢量指针则必须放到暂存器DS:DX中.
4.6 连接中断处理程序
若是把前一节的程序拿来执行时,键盘是无法输入的,事实上,处理键盘的硬件中断处理程序会继续地读取敲入的字符,并且放到等待队列中,直到队列填满为止;但是由于读取等待队列的软件中断INT 16H已经被改变了,因此队列的内容就永远取不出来.
现在写一个中断处理程序,这个中断处理程序只是调用原先的键盘中断处理程序,一旦做到这一点之后,接下来就可以根据键盘的输入做修改.以下就是调用原先键盘处理程序的驻留程序:
cseg segment
assume cs:cseg,ds:cseg
org 100h
start:
jmp Initialize
Old_Keyboard_IO dd ?
;Section 1
new_keyboard_io proc far
sti
;Section 2
pushf
assume ds:nothing
call Old_Keyboard_IO
nop
iret
new_keyboard_io endp
;Section 3
Initialize:
assume cs:cseg,ds:cseg
mov bx,cs
mov ds,bx
mov al,16h
mov ah,35h
int 21h
mov word ptr Old_Keyboard_IO,bx
&nbs