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

WillJiang001 2012-06-23 10:49:10
这是我将王爽的《汇编语言》第15章外中断的一道例题改编了一下

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

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

接下来就是全部代码:



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

























...全文
3209 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bruceliangrnglin 2013-06-12
  • 打赏
  • 举报
回复 1
赞同3楼所说的,这个只有学了微机原理的可屏蔽中断管理芯片8255a才会明白,光学王爽的汇编课本,还有很多底层硬件细节他没有讲到。。。
Tishion 2012-06-24
  • 打赏
  • 举报
回复 4
EOI是外部中断的中断结束命令,这个CPU执行
mov al,20h
out 20h,al
就是给8259a芯片发送EOI命令,通知8259A芯片一个中断完成,8259a将负责把ISR中的位清除,以便以后可以继续接受中断。

如果不加的话,8259a永远收不到中断结束命令,那么就认为某一个中断一直在执行,所以如果遇到比这个阻塞的中断级别低或者相等的中断发生时就不会再响应了。
WillJiang001 2012-06-24
  • 打赏
  • 举报
回复
恩,明白了,谢谢
WillJiang001 2012-06-23
  • 打赏
  • 举报
回复
我似乎自己自想明白了,看看高人们的想法是不是和我一样
WillJiang001 2012-06-23
  • 打赏
  • 举报
回复
额。。自己顶一下

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧