8086汇编-外中断(15)
引言
之前我们讨论的都是CPU对指令的执行。我们知道CPU在计算机系统中,除了能够执行指令外,还能进行运算,还应该能够对外部设备进行控制,接受它们的输入,向他们输出
也就是说:CPU除了运算能力外,还有I/O(input/output)能力
1.接口芯片和端口
在PC系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,CPU将这些寄存器当作端口来访问。
外设的输入和CPU的输出都不是直接的,而是通过送入相关的接口芯片的端口中。
1 | 每一个外部设备都有一个小小的,类似于内存一样的端口 |
1 | CPU通过端口和外部设备进行联系 |
2.外中断信息
由CPU的自己产生的中断信息叫内中断,非CPU由外部中断的叫外中断
外中断一共有2种
1 | 1.可屏蔽中断【要看IF位的设置】 |
当CPU检测到可屏蔽信息的时候
1 | 如果IF=1,则CPU在执行完当前指令后,响应中断 |
内中断的过程
1 | 1.取得中断类型码N |
外中断信息
1 | 可屏蔽中断所引发的中断的过程和内中断基本一样,除了第一个 |
8086CPU提供了设置IF的指令
1 | sti 。将IF设置为1 |
不可屏蔽中断的中断过程
1 | 标志寄存器入栈,IF=0,TF=0 |
3.PC键盘的处理过程
1 | 1.键盘输入 |
键盘上每一个健相当于一个开关,键盘中由一个芯片对减半上的每一个健的开关状态进行扫描
按下一个健的时候,就会产生一个扫描码,这个扫描码就会被送入接口芯片的寄存器中,改寄存器的端口地址就是60H
,松开的时候也会产生一个扫描码
按下的码【通码】,松开【断码】
扫描长度是一个字节,通码的第七位为0,断码的第七位为1
1 | 断码 = 通码 + 80H |
bios提供了 int 9 中断例程
1 | 1.读取60H端口的扫描码 |
一般情况下,CPU在执行当前指令后,如果检测到中断信息,就响应中断,引发中断过程
可是在有些情况下,CPU在执行当前指令后,即便是发生中断,也不会响应
该内存区可以存储15个键盘输入,因为int 9 中断例程除了接收扫描码外,还要产生 字符吗,所以BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码
0040:17单元控制着键盘键的状态字节
4.编写int 9 中断例程
过程
1 | 1.键盘产生扫描码 |
啦啦啦
1 | s1: |
这个代码和c语言中的
1 | for(i=0; i<100; i++){ |
实现IF和TF=0的操作
1 | pushf |
5.总结一下啦
8086CPU提供一下几个大类的指令
1.数据传送指令
1 | mov push pop pushf popf xchg |
2.算数运算指令
1 | add sub adc sbb inc dec cmp imul idiv aaa |
3.逻辑指令
1 | and or not xor test shl shr sal sar rol ror rcl rcr |
4.转移指令
1 | 可以修改IP,或者CS和IP |
5.处理机控制指令
1 | 对标志寄存器或者其他处理机状态进行设置 |
6.串处理指令
1 | 对内存中的批量数据进行处理 |