CPU除了有运算功能外,还要有 I/O(Input/Output,输入/输出)能力。比如键盘按下一个键,CPU最终要能处理这个键。
CPU通过端口和外部设备进行联系
###外中断信息 来自于CPU外部,当CPU外部有需要处理的事情发生的时候,比如:外设的输入到达,相关芯片向CPU发出相应地中断信息,引发中断过程,处理外设的输入
在PC系统中,外中断源一共有以下两类:
###1. 可屏蔽中断 几乎所有外设引发的外中断,都是可屏蔽中断
CPU可以不响应的外中断,根据IF位的设置
IF=1 则CPU在执行完当前指令后响应中断
IF=0 则不响应可屏蔽中断
回忆内中断
所引发的中断过程:
- 取中断类型码n
- 标志寄存器入栈,IF=0,TF=0
- CS、IP入栈
- (IP)=(n * 4),(CS)=(n * 4 + 2)
可屏蔽中断所引发的中断过程,除在第一步的实现上有所不同外,基本上和内中断的中断过程相同。因为可屏蔽中断信息来自于CPU外部,中断类型码是通过数据总线送入CPU的;而内中断的中断类型码是在CPU内部产生的
在中断处理中需要处理可屏蔽中断,可以用指令设置将IF=1,8086CPU提供的设置IF的指令是:
sti ;设置IF=1
cli ;设置IF=0
###2. 不可屏蔽中断
对于8086CPU,不可屏蔽中断的中断类型码固定为2
不可屏蔽中断过程为:
- 标志寄存器入栈,IF=0,TF=0
- CS、IP入栈
- (IP)=(8),(CS)=(0AH)
不可屏蔽中断是在系统中有必须处理的紧急情况发生时用来通知CPU的中断信息(待学习讨论)
###PC机键盘的处理过程 ####1.键盘输入 键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个的开关状态进行扫描
按下一个键时:开关接通,该芯片产生一个扫描码(键盘上的位置),被送入主板上相关接口芯片的寄存器中,该寄存器的端口地址为60h
松开按下的键时:也产生一个扫描码,也被送入60h
一般按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。扫描码长度为一个字节,通码的第7位为0,断码的第7位为1,即:
断码=通码+80H
键盘扫描码自行Google,keywords:键盘 扫描码
####2.引发int 9号中断 键盘的输入到达60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息
####3.执行int 9中断例程 BIOS提供了int 9中断例程,主要工作如下:
- 读出60h端口中的扫描码
- 如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;如果是控制键(比如Ctrl)和切换键(比如 CapsLock)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元
- 对键盘系统进行相关的控制,比如:向相关芯片发出应答信息
BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9中断例程所接收的键盘输入的内存区。
该内存区可以存储15个键盘输入,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码
###编写int 9中断例程 键盘输入的处理过程:
- 键盘产生扫描码
- 扫描码送入60h端口
- 引发9号中断
- CPU执行int 9中断例程处理键盘输入
上面的过程中,第1,2,3步都是由硬件系统完成的,只能够改变int 9中断处理程序
BIOS提供的int 9中断例程已经对这些硬件细节进行了处理,只需要在自己编写的中断例程中调用BIOS的int 9中断例程即可(使用别的指令对int指令进行一些模拟)
必须在DOS实模式下运行