这是我将王爽的《汇编语言》第15章外中断的一道例题改编了一下
题目的意思是将BIOS的INT9键盘中断改编,按下ESC键后将循环显示的字母背景颜色改变。
我的问题是,为什么在自己改编的中断程序INT9返回前一定要加 mov al,20h以及out 20h,al这两句?
这是发送EOI的指令吧,但我为什么不加这两句,程序依旧能运行,就是ESC按下去没有效果,且程序结束的时候就不会恢复INT9原来的功能(加上就没这些事情了),很困惑,求解~~~~
接下来就是全部代码:
- Assembly code
assume cs:code,ss:stackstack segment dw 10 dup(0)stack endscode segmentstart: mov ax,stack //初始化 mov ss,ax mov sp,20 mov ax,0 mov es,ax push es:[9*4+2] push es:[9*4] mov word ptr es:[9*4],offset int9 //送中断向量 mov word ptr es:[9*4+2],seg int9 mov ax,0b800h mov es,ax mov cx,26 mov al,'a'lop1: mov byte ptr es:[160*16],al //循环显示26个字母 call delay inc al loop lop1 mov ax,0 mov es,ax pop es:[9*4] //恢复原有的INT9功能 pop es:[9*4+2] mov ax,4c00h int 21hdelay: push ax //延时程序,可以无视,哈哈 push dx mov dx,10h mov ax,0s1: sub ax,1 sbb dx,0 cmp ax,0 jne s1 cmp dx,0 jne s1 pop dx pop ax retint9: push ax //中断程序 push es mov ax,0b800h mov es,ax in al,60h cmp al,1 jne endsub inc byte ptr es:[160*16+1] endsub: mov al,20h //问题这在这里,为什么不加这两句,按ESC就没效果呢? out 20h,al pop es pop ax iretcode endsend start
------解决方案--------------------------------------------------------
EOI是外部中断的中断结束命令,这个CPU执行
mov al,20h
out 20h,al
就是给8259a芯片发送EOI命令,通知8259A芯片一个中断完成,8259a将负责把ISR中的位清除,以便以后可以继续接受中断。
如果不加的话,8259a永远收不到中断结束命令,那么就认为某一个中断一直在执行,所以如果遇到比这个阻塞的中断级别低或者相等的中断发生时就不会再响应了。