当前位置: 代码迷 >> 汇编语言 >> 关于中断结束EOI命令的一个有关问题,很困惑,求解~
  详细解决方案

关于中断结束EOI命令的一个有关问题,很困惑,求解~

热度:5040   发布时间:2013-02-26 00:00:00.0
关于中断结束EOI命令的一个问题,很困惑,求解~~
这是我将王爽的《汇编语言》第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永远收不到中断结束命令,那么就认为某一个中断一直在执行,所以如果遇到比这个阻塞的中断级别低或者相等的中断发生时就不会再响应了。
  相关解决方案