汇编入门学习笔记 (十三)—— 外中断
参考: 《汇编语言》 王爽 第15章
1.外中断信息
外中断分为可屏蔽中断和不可屏蔽中断
可屏蔽中断
先看看内中断所引发的中断过程:
(1)取中断类型吗n。
(2)标志寄存器入栈,设置IF=0,TF=0.
(3)CS、IP入栈
(4)(IP)=(n*4),(CS)=(n*4+2)
可屏蔽中断的中断过程于内中断所引发的中断过程不同的地方只是,第一步不同。可屏蔽中断的中断过程,CPU要先看IF的值,如果IF=0就不执行中断,如果IF=1执行中断。
不可屏蔽中断
不可屏蔽中断是CPU必须相应的中断。不可屏蔽中断很少,所以中断类型吗固定为2,中断过程不需要取中断类型吗
不可屏蔽中断的中断过程:
(1)标志寄存器入栈,设置IF=0,TF=0.
(2)CS、IP入栈
(3)(IP)=(8),(CS)=(0AH)
2. PC机键盘的处理过程
当我们按下一个键时,键盘上的芯片产生一个扫描码,扫描吗说明了按下键盘的键在键盘的位置。扫描吗被送入主板上的相关接口芯片的寄存器中,该寄存器的端口是60h。一般按下一个键的扫描吗叫通吗,松开一个键的扫描吗叫断码,通吗第7位0,断码第7位1,即 断码=通吗 + 80h
键盘的扫描吗到达60h是,相关芯片就会向CPU发出中断类型吗为9的可屏蔽中断信息。
int 9 中断例程主要工作:
(1)读出60h端口的扫描吗
(2)如果是字符键的扫描吗,就将该扫描吗和它所对应的字符吗(ASCII吗)送入内存中的BIOS键盘缓冲区;如果是控制键(如Ctrl)和切换键(如CapsLock)的扫描吗,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储的状态字节单元
(3)对键盘系统进行相关的控制。比如,相相关芯片发出应答信息。
3. 修改int 9 中断
先实现,在屏幕中间间隔显示‘a’ ~ z 字符,要实现间隔显示,就要有延时,用循环非常多的次数来延时。
实现代码:
- assumecs:code
- codesegment
- start:
- movax,0b800h
- moves,ax
- moval,a
- s:
- moves:[160*12+40*2],al
- calldelay;循环10000000次,用来延时
- incal
- cmpal,z
- jnas
- movax,4c00h
- int21h;
- delay:
- pushax
- pushdx
- movdx,1000h;外层循环1000h次,内层循环100000h次
- movax,0
- s1:
- subax,1
- sbbdx,0
- cmpax,0
- jnes1
- cmpdx,0
- jnes1
- popdx
- popax
- ret
- codeends
- endstart
再实现按下ESC键后,改变显示字符的颜色
- assumecs:code
- stacksegment
- db128dup(0)
- stackends
- datasegment
- dw0,0
- dataends
- codesegment
- start:
- movax,stack
- movss,ax
- movsp,128
- movax,data
- movds,ax
- movax,0
- moves,ax
- pushes:[9*4]
- popds:[0];将原来的int9中断例程的入口保存到ds:0、ds:2中
- pushes:[9*4+2]
- popds:[2]
- movwordptres:[9*4],offsetint9;在中断向量表中设置新的int9*4中断例程的入口地址
- moves:[9*4+2],cs
- movax,0b800h
- moves,ax
- moval,a
- s:
- moves:[160*12+40*2],al
- calldelay;循环10000000次,用来延时
- incal
- cmpal,z
- jnas
- movax,0
- moves,ax
- pushds:[0]
- popes:[9*4]
- pushds:[2]
- popes:[9*4+2]
- movax,4c00h
- int21h;
- delay:
- pushax
- pushdx
- movdx,1000h;外层循环1000h次,内层循环100000h次
- movax,0
- s1:
- subax,1
- sbbdx,0
- cmpax,0
- jnes1
- cmpdx,0
- jnes1
- popdx
- popax
- ret
- int9:
- pushax
- pushbx
- pushes
- inal,60h
- pushf
- pushf
- popbx
- andbh,11111110b;设置IF=0.TF=0
- pushbx
- popf
- calldwordptrds:[0];模拟调用原来的int9*4中断例程
- cmpal,1;1就是ESC的键盘扫描码
- jneint9ret
- movax,0b800h
- moves,ax
- incbyteptres:[160*12+40*2+1];每次按下ESC键加1,来改变颜色属性
- int9ret:
- popes
- popbx
- popax
- iret
- codeends
- endstart
汇编入门外中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)