张狂的暑假学习之 汇编入门学习笔记 (十三)—— 外中止
参阅: 《汇编语言》 王爽 第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