鸿 网 互 联 www.68idc.cn

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

来源:互联网 作者:佚名 时间:2015-09-03 08:17
关于 中断 结束 EOI 命令 的 一个 问题 ,很 困惑 , 求解 ~~ 这是我将王爽的《汇编语言》第15章外 中断 的一道例题改编了一下 题目的意思是将BIOS的INT9键盘 中断 改编,按下ESC键后将循环显示的字母背景颜色改变。 我的 问题 是,为什么在自己改编的 中断
关于中断结束EOI命令一个问题,很困惑求解~~
这是我将王爽的《汇编语言》第15章外中断的一道例题改编了一下

题目的意思是将BIOS的INT9键盘中断改编,按下ESC键后将循环显示的字母背景颜色改变。

我的问题是,为什么在自己改编的中断程序INT9返回前一定要加 mov al,20h以及out 20h,al这两句?
这是发送EOI的指令吧,但我为什么不加这两句,程序依旧能运行,就是ESC按下去没有效果,且程序结束的时候就不会恢复INT9原来的功能(加上就没这些事情了),很困惑求解~~~~

接下来就是全部代码:


Assembly code

assume cs:code,ss:stack

stack   segment

        dw 10 dup(0)

stack   ends


code    segment

start:
        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   21h

delay:  push  ax   //延时程序,可以无视,哈哈

        push  dx

        mov   dx,10h

        mov   ax,0

s1:     sub   ax,1

        sbb   dx,0

        cmp   ax,0

        jne   s1

        cmp   dx,0

        jne   s1

        pop   dx

        pop   ax

        ret

int9:   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

        iret

code  ends

end start
        









   
   













   


------解决方案--------------------------------------------------------
EOI是外部中断中断结束命令,这个CPU执行
mov al,20h
out 20h,al
就是给8259a芯片发送EOI命令,通知8259A芯片一个中断完成,8259a将负责把ISR中的位清除,以便以后可以继续接受中断

如果不加的话,8259a永远收不到中断结束命令,那么就认为某一个中断一直在执行,所以如果遇到比这个阻塞的中断级别低或者相等的中断发生时就不会再响应了。
网友评论
<