外中断
CPU内部引发的中断称作内中断,外部引发的中断称为外中断。而外中断源分为以下两类:一,可屏蔽中断。二,不可屏蔽中断。
可屏蔽中断:
可屏蔽中断就是CPU可以不响应这个中断。CPU是否要响应这个中断要看标志寄存器中的IF标志位的值。如果IF标志位等于0,那么CPU则不响应这个中断,如果IF标志位为 1 ,CPU则响应这个中断,所以每次的中断过程中都一个把IF设置为0的动作,就是让CPU在进入中断处理后禁止其他的可屏蔽中断。可屏蔽中断引发的中断过程和内中断的差不多,除第一步获取中断类型码的途径有所不同,内中断的中断类型码是在CPU内部产生的,而外中断的中断类型码是在CPU外部通过数据总线传给CPU的。
我们也有可以设置IF位的指令: sti :设置IF为 0 ,cli : 设置IF为 1 。
不可屏蔽中断:
不可屏蔽中断就是CPU必须响应的外中断,它的中断类型码固定为 2 ,所以由它引发的中断过程中没有取得中断类型码的那一步。不过后面三步还是一样的。
大多数由外设引发的中断都是可屏蔽中断。
PC键盘的处理过程
键盘上的每一个键相当于一个开关,而键盘上有一个芯片对这些键盘上的每一个开关的状态进行扫描。当我们摁下一个键时,相当于接通了一个开关,那个芯片就会产生一个扫描码,扫描码里包含了这个键的位置。然后这个扫描码就会被送入在主板上和这个相关的接口芯片的寄存器中。这个寄存器的端口地址为 60 h.
而松开一个键,也会产生一个对应的扫描码,也是包含了这个键的位置,这个扫描码也会被送入主板上和这个相关的接口芯片的寄存器中,端口地址也是60 h 。
扫描码的长度都是一个字节
按下一个键产生的扫描码我们称为通码,松开一个键产生的码称为断码。而一个相同的键,它的通码和断码的区别就是:通码的第七位为0,断码的第七位为 1 。所以 断码=通码+80h
当我们敲击键盘产生的扫描码到达了 60 h 端口,相关的芯片就会向CPU发送中断类型码为9的可屏蔽中断信息,然后CPU检测到这个信息后,如果IF的值为1,那么CPU就会去处理这个中断。引发中断过程,转而去处理 int 9 中断例程。
int 9 中断例程是由BIOS提供的处理键盘的基本输入的例程。它的工作如下:
一、读取端口 60 h 中的扫描码
二、如果是字符码,把它的扫描码和对应的ASCII码送入内存中的BIOS键盘缓冲区,一个键盘输入用一个字单元存放,高位字节存放扫描码,低字节存放ASCII码。(因为扫描码包含了是接通这个键还是断开这个键的信息)
如果是控制键或切换键,则将其转变为状态字节,并存储到内存中存储状态字节的单元。键盘状态字节是由一个二进制位表示的。
BIOS键盘缓冲区
BIOS键盘缓冲区是用来存放 INT 9 例程所接收的那些从键盘输入中所得到的信息(扫描码,ASCII码)的一个内存区。它一共能存放15个键盘输入
0040:17这个一个字节的存储单元存放了控制键和切换键的状态信息
编写INT 9中断例程
如果我们要编写一个程序,字屏幕上显示从字符 ‘a’~‘z’,并且按一下 esc键就换一种颜色。
首先我们要编写一个程序在屏幕上显示字符 'a'~'z',并且我们要让它让人看得清,因为CPU的处理速度很快,可能我们还没来得及反应它就已经显示完所有的字符了。所以我们可以再编写一个循环程序,并且让它循环的次数足够大,让我们可以看清字符,而这个循环的程序可以作为一个子程序,我们每显示一个字符就调用一下它。首先我们来编写一下显示字符的程序。
这是我们显示字符的程序,然后我们要再写一个循环的程序(抱歉,上面有个错误,应该是segment)
对于按一下 esc 就改变颜色,我们可以用以下方法来实现:
首先,因为当我们摁下键盘之后,产生的扫描码就会传送到 60 h 端口,然后芯片发出中断信息,CPU再根据IF的值决定要不要响应,引发中断过程。所以我们的程序可以从 60H 获取键盘信息。然后对于一些处理键盘中断程序必要的硬件细节,我们可以调用 BIOS中的 int 9h 例程。最后我们要判断是否为 esc 的扫描码,是的话改变颜色然后返回,不是的话直接返回。
获取60H中的扫描码我们可以直接用指令 in al,60h
调用BIOS的 int 9h:因为 int 9h 程序它就是用来处理键盘的输入的,所以我们敲击键盘后的工作都是这个程序来做,而我们现在要写的程序是要处理我们的键盘输入的,所以我们要用我们直接写的这个程序来代替原来的这个 int 9h ,而又因为我们在我们自己写的程序里面要调用到这个出程序,所以我们可以先把这个 int 9 h程序的入口储存起来,也就是把它的程序地址先压入栈,要用的时候再通过它的地址来调用。但是我们调用它的时候不能再用int 9 来调用,我们可以模拟中断过程来调用它。不过第一步获取中断类型码我们不用模拟,直接先将标志寄存器的值入栈,然后将 TF,IF设置为0,然后将CS,IP入栈,最后把CS:IP设置为程序入口,最后两步我们可以直接用 call dword ptr ds:[0] 来解决,因为这个指令的功能就是:将CS,IP入栈,然后将后面的指向的内存单元中提取两个字,高位作为CS,低位作为IP。
对于改变字符的颜色,我们只需要改变属性就可以了。
我们写完这些程序,肯定还要写一个安装程序,而我们把之前的 int 9 的程序入口储存下来的操作不能在按装程序中,应该写在我们的新的程序中。
我们总结一下我们当前学得到的指令:
本文发布于:2024-01-31 23:11:03,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170671386532072.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |