#头条群星9月榜#
8086的中断由中断控制器芯片8259A控制,其内部结构如下图:
图1
CPU与8259的连接如下图:
图2
要特别注意,8259由引脚INT向CPU发出中断请求,CPU则通过INTA引脚响应这个请求。
下面是一个中断程序,这个程序是显示10遍字符串‘A 8259A Interrupt’:
图3
上图是定义字符串
图4
上图是保存原中断向量表中的8号中断源的地址,调用了INT 21H的35H号功能。
图5
上图是将自己编写的中断程序new08的入口地址放入中断向量表类型8的存储单元中,调用了INT 21H的25H号功能。
图6
由于上图的中断向量表是系统设定的,只能临时更改,所以要把类型8中断的向量地址保存下来。
图7
注意图1和图2中8259有8个中断采集引脚IR0-IR8,但在某个具体的程序中,不一定要全部用到,所以可以通过中断屏蔽寄存器IMR设定哪些引脚生效。上图是保证IR0引脚有效,用于接收定时器8253的中断请求。
图8
主程序运行到这里以后,就在这里循环等待中断程序的中断请求。
从上图开始进入中断程序。
注意counter是中断程序和主程序进行交流的变量。
上面两个图是从字符串‘A 8259A Interrupt’逐个取出字符,并调用int10h进行显示,其中的BX表示字符显示的位置和颜色,AH是int10h的功能号。
中断程序每调用一次,就显示一次字符串,每次运行完以后都要恢复图3中保存的原中断向量表中的8号中断源的地址。
最后要恢复图4中保存的原中断类型8在向量表中的地址和图7中保存的原中断屏蔽寄存器IMR中的内容。
上面程序这个编程思路可以概括如下:
1:开始编写程序的时候,我们要有图2的大概印象,即8259和8086是通过中断引脚INT和INTR连接的,我们编写的这个程序,是要响应8259通过INT引脚向CPU发出的中断请求的,这个中断请求可以是一个5V的高电平。
2:8259每隔一段时间(比如1秒钟)才发出一次请求。
3:8086响应一次中断请求就执行一次中断程序new08。
4:由于8259A1秒钟才发出一次请求,而CPU执行指令的时间则非常快(纳秒级),那么,CPU多余的时间怎么办呢?因此,主程序中必须有一个循环等待指定(图8),也就是说,当CPU响应一次中断即执行完一次中断程序以后,多余的时间就执行循环指令,等待下一次中断请求的到来。
5:必须把主程序和中断程序区分开来,主程序肯定会被CPU执行,中断程序则只有当INT引脚出现8259的中断请求以后才会被执行。