疯狂暑期学习 汇编入门学习笔记 (十三)—— 外中断
參考: 《汇编语言》 王爽 第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机键盘的处理过程
当我们按下一个键时,键盘上的芯片产生一个扫描码,扫描吗说明了按下键盘的键在键盘的位置。扫描吗被送入主板上的相关接口芯片的寄存器中,该寄存器的port是60h。一般按下一个键的扫描吗叫通吗。松开一个键的扫描吗叫断码,通吗第7位0,断码第7位1。即 断码=通吗 + 80h
键盘的扫描吗到达60h是,相关芯片就会向CPU发出中断类型吗为9的可屏蔽中断信息。
int 9 中断例程主要工作:
(1)读出60hport的扫描吗
(2)假设是字符键的扫描吗。就将该扫描吗和它所相应的字符吗(ASCII吗)送入内存中的BIOS键盘缓冲区。假设是控制键(如Ctrl)和切换键(如CapsLock)的扫描吗。则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储的状态字节单元
(3)对键盘系统进行相关的控制。
比方,相相关芯片发出应答信息。
3. 改动int 9 中断
先实现,在屏幕中间间隔显示‘a’ ~ 'z' 字符,要实现间隔显示,就要有延时,用循环许多的次数来延时。
实现代码:
assume cs:codecode segmentstart: mov ax,0b800h mov es,ax mov al,'a's: mov es:[160*12+40*2],al call delay ;循环10000000次,用来延时 inc al cmp al,'z' jna s mov ax,4c00h int 21h; delay: push ax push dx mov dx,1000h ;外层循环1000h次,内层循环100000h次 mov ax,0s1: sub ax,1 sbb dx,0 cmp ax,0 jne s1 cmp dx,0 jne s1 pop dx pop ax ret code endsend start
再实现按下ESC键后。改变显示字符的颜色
assume cs:codestack segment db 128 dup(0)stack endsdata segment dw 0,0data endscode segmentstart: mov ax,stack mov ss,ax mov sp,128 mov ax,data mov ds,ax mov ax,0 mov es,ax push es:[9*4] pop ds:[0] ;将原来的int 9 中断例程的入口保存到 ds:0、ds:2中 push es:[9*4+2] pop ds:[2] mov word ptr es:[9*4],offset int9 ;在中断向量表中设置新的int 9*4中断例程的入口地址 mov es:[9*4+2],cs mov ax,0b800h mov es,ax mov al,'a's: mov es:[160*12+40*2],al call delay ;循环10000000次,用来延时 inc al cmp al,'z' jna s mov ax,0 mov es,ax push ds:[0] pop es:[9*4] push ds:[2] pop es:[9*4+2] mov ax,4c00h int 21h; delay: push ax push dx mov dx,1000h ;外层循环1000h次。内层循环100000h次 mov ax,0s1: sub ax,1 sbb dx,0 cmp ax,0 jne s1 cmp dx,0 jne s1 pop dx pop ax ret int9: push ax push bx push es in al,60h pushf pushf pop bx and bh,11111110b ;设置IF=0.TF=0 push bx popf call dword ptr ds:[0] ;模拟调用原来的int 9*4中断例程 cmp al,1 ;1就是ESC的键盘扫描码 jne int9ret mov ax,0b800h mov es,ax inc byte ptr es:[160*12+40*2+1] ;每次按下ESC键加1,来改变颜色属性 int9ret: pop es pop bx pop ax iret code endsend start
版权声明:本文博客原创文章。博客,未经同意,不得转载。