婚礼策划网站设计重庆关键词搜索排名
外中断和内中断的处理过程相似。只不过中断源的产生来自外部。
本章,可以说是端口和内中断的内容结合。
书上以键盘为例,讲解外部中断的处理过程。
1 PC机键盘的处理过程
- 键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。
- 按下一个键是,开关接通,该芯片就产生一个扫描码,扫描码说明了按下的键在键盘上的位置。扫描码被送入主板上的相关接口芯片的寄存器中,该寄存器的端口地址为60h。
- 松开按下的键时,也产生一个扫描码,扫描码说明了松开的键在键盘上的位置。松开按键时产生的扫描码也被送入60h端口中。
- 一般将按下一个键时产生的扫描码称为 通码,松开一个按键产生的扫描码称为 断码。扫描码长度为1个字节,通码 的第7位为0,断码的第7位为1,即:
- 断码=通码+80h
整体思路,如下
至于,cpu如何得知端口有内容需要读取,如何读取,这涉及中断的查询,本次不讨论。(查询,中断,DMA)
2 实验
2.1 实验内容:
;安装一个新的int9中断例程
;功能: 在DOS下,按下“A”后,除非不在松开,如果松开,显示满屏幕的“A”,其他键照常处理。
2.1 实验思路:
实验要处理的是int9的中断函数。因为原理啊的int9中断涉及硬件细节,咱们把它保存到其他地方。新的int9,在原理啊的int9的功能上进行扩充。当使用到原理啊int9的时候,咱们在调用原来的int9。
2.3实验代码(注:由于采用emu8086,没有在实际的DOS中运行过程序,未知是否存在bug。)
;---------------------------------
;安装一个新的int9中断例程
;功能: 在DOS下,按下“A”后,除非不在松开,如果松开,显示满屏幕的“A”,其他键照常处理
;dacao 2019/5/8
;---------------------------------assume cs:codestack segmentdb 128 dup(0)
stack endscode segment ;初始化段
start: mov ax,stack mov ss,axmov sp,128;复制程序mov ax,cs mov ds,axmov ax,0mov es,ax mov si,offset int9mov di,204hmov cx,offset int9end - offset int9cldrep movsb ;保存原来的int9中断地址到0:200;修改向量表到新的int9(新的中断程序入口地址在0:204)push es:[9*4]pop es:[200h]push es:[9*4+2]pop es:[202h] ;内存不能到内存,借用一下栈cli ;屏蔽外中断,防止此时键盘输入(cs:ip)同时设置mov word ptr es:[9*4],204hmov word ptr es:[9*4+2],0sti;在程序结束的时候恢复int9中断例程 ;;mov ax, 0 ;mov es, ax ;cli ;push ds:[0] ;pop es:[9*4] ;push ds:[2] ;pop es:[9*4+2] ;;sti ;hltmov ax,4c00hint 21h;新的int9中断函数
int9:push axpush bxpush cxpush espush siin al,60h ;从键盘的端口读入输入的字符pushfcall dword ptr cs:[200h] ;键盘按下,调用中断。键入我们现在新的int9中断,cs=0.(我们此时,去调用原来的中断)cmp al,1eh+80h ;判断是否为A的断码jne int9ret mov ax,0b800hmov es,axmov si,0mov cx,80*10 ;显示10行就好了。mov ah,'A'
s: mov es:[si],ahadd si,2 loop s int9ret:pop sipop espop cxpop bxpop axiret int9end:nopcode ends
end start
注:
8086CPU 提供的设置IF的指令:
sti,设置IF=1;
cli,设置IF=0.
参考文章:
https://blog.csdn.net/madao1234/article/details/84609221
https://blog.csdn.net/include_heqile/article/details/81270423