CPU通过总线和端口来与外部设备进行联系,外部可屏蔽中断的中断类型码是通过数据总线送入CPU的。
IF=1,CPU响应中断,引发中断过程
IF=0,不响应可屏蔽中断
sti指令,设置IF=1
cli指令,设置IF=0
中断过程:
(1) 取得中断类型码N
(2) pushf
(3) TF=0,IF=0
(4) push CS
(5) push IP
(6) (IP)=(N*4),(CS)=(N*4+2)
不可屏蔽中断的中断过程:
(不可屏蔽中断的中断类型码固定为2,不用获取)
(1) pushf
(2) TF=0,IF=0
(3) push CS
(4) push IP
(5) (IP)=(8),(CS)=(0AH)
几乎所有由外设引发的外中断,都是可屏蔽中断
键盘按下一个键产生的扫描码为通码
键盘松开一个键产生的扫描码为断码
扫描码长度为一字节,通码第7位为0,断码第7位为1
断码=通码+80h
键盘输入到达60H端口时,引发9号中断
9号中断是可屏蔽中断,由BIOS提供的,用来进行基本的键盘输入处理
执行int 9中断:
(1)读出60H端口中的扫描码
(2)如果是字符扫描码,将扫描码和对应的字符码(ASCII码)送入内存BIOS键盘缓冲区,如果是控制键,则将其转为状态字节写入存储状态字的单元
(3)对键盘系统进行相关的控制
在BIOS键盘缓冲区中可存储15个键盘输入,一个键盘输入用一个字单元存放,高位扫描码,低位字符码
0040:17单元存放键盘状态字节,记录了控制键和切换键的状态
键盘输入的处理过程:
1、键盘产生扫描码
2、扫描码送入60H端口
3、引发9号中断
4、CPU执行int 9中断例程处理键盘输入
int指令执行中断过程: 模拟
(1) 取得中断类型码N (1)不需要定位入口地址
(2) 标志寄存器入栈 (2)pushf
(3) TF=0,IF=0 (3)pushf
pop ax
and ah,11111100b ;IF为flag的第9位
;TF为flag的第8位
push ax
popf
(4) CS、IP入栈 (4)call dword ptr ds:[0]
(5) (IP)=(N*4),(CS)=(N*4+2)
因为在进入中断例程后,IF和TF都已置0,没有必要再进行设置了,对于模拟int指令可以精简为:
pushf ;标志寄存器入栈
call dword ptr ds:[0] ;CS、IP入栈;(IP)=ds:[0],(CS)=ds:[2]
CPU对外设输入的通常处理方法:
(1)外设的输入端口
(2)向CPU发出外中断(可屏蔽中断)信息
(3)CPU检测到可屏弊中断信息,如果IF=1,cpu在执行完当前指令后响应中断,执行相应的中断例程
(4)可在中断例程中实现对外设输入的处理