×
嵌入式 > 技术百科 > 详情

汇编入门学习笔记 (十三)—— 外中断

发布时间:2020-06-20 发布时间:
|
疯狂的暑假学习之  汇编入门学习笔记 (十三)——  外中断

 

参考: 《汇编语言》 王爽 第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' 字符,要实现间隔显示,就要有延时,用循环非常多的次数来延时。

实现代码:

 

  1. assume cs:code  
  2.   
  3. code segment  
  4.   
  5. start:  
  6.     mov ax,0b800h  
  7.     mov es,ax  
  8.     mov al,'a'  
  9. s:    
  10.     mov es:[160*12+40*2],al  
  11.     call delay  ;循环10000000次,用来延时  
  12.     inc al  
  13.     cmp al,'z'  
  14.     jna s  
  15.       
  16.     mov ax,4c00h  
  17.     int 21h;  
  18.       
  19. delay:  
  20.     push ax  
  21.     push dx  
  22.     mov dx,1000h   ;外层循环1000h次,内层循环100000h次  
  23.     mov ax,0  
  24. s1:  
  25.     sub ax,1  
  26.     sbb dx,0  
  27.     cmp ax,0  
  28.     jne s1  
  29.     cmp dx,0  
  30.     jne s1  
  31.     pop dx  
  32.     pop ax  
  33.     ret  
  34.       
  35.   
  36. code ends  
  37.   
  38. end start  


 

再实现按下ESC键后,改变显示字符的颜色

 

  1. assume cs:code  
  2.   
  3. stack segment  
  4.     db 128 dup(0)  
  5. stack ends  
  6.   
  7. data segment  
  8.     dw 0,0  
  9. data ends  
  10.   
  11. code segment  
  12.   
  13. start:  
  14.     mov ax,stack  
  15.     mov ss,ax  
  16.     mov sp,128  
  17.       
  18.     mov ax,data  
  19.     mov ds,ax  
  20.       
  21.     mov ax,0  
  22.     mov es,ax  
  23.   
  24.     push es:[9*4]  
  25.     pop ds:[0]        ;将原来的int 9 中断例程的入口保存到 ds:0、ds:2中  
  26.     push es:[9*4+2]  
  27.     pop ds:[2]    
  28.       
  29.     mov word ptr es:[9*4],offset int9   ;在中断向量表中设置新的int 9*4中断例程的入口地址  
  30.     mov es:[9*4+2],cs  
  31.       
  32.       
  33.     mov ax,0b800h  
  34.     mov es,ax  
  35.     mov al,'a'  
  36. s:    
  37.     mov es:[160*12+40*2],al  
  38.     call delay  ;循环10000000次,用来延时  
  39.     inc al  
  40.     cmp al,'z'  
  41.     jna s  
  42.       
  43.     mov ax,0  
  44.     mov es,ax  
  45.     push ds:[0]  
  46.     pop es:[9*4]  
  47.     push ds:[2]  
  48.     pop es:[9*4+2]  
  49.       
  50.     mov ax,4c00h  
  51.     int 21h;  
  52.       
  53. delay:  
  54.     push ax  
  55.     push dx  
  56.     mov dx,1000h   ;外层循环1000h次,内层循环100000h次  
  57.     mov ax,0  
  58. s1:  
  59.     sub ax,1  
  60.     sbb dx,0  
  61.     cmp ax,0  
  62.     jne s1  
  63.     cmp dx,0  
  64.     jne s1  
  65.     pop dx  
  66.     pop ax  
  67.     ret  
  68.       
  69. int9:  
  70.     push ax  
  71.     push bx  
  72.     push es  
  73.       
  74.     in al,60h  
  75.       
  76.     pushf         
  77.     pushf  
  78.     pop bx  
  79.     and bh,11111110b   ;设置IF=0.TF=0  
  80.     push bx  
  81.     popf  
  82.     call dword ptr ds:[0]   ;模拟调用原来的int 9*4中断例程  
  83.       
  84.     cmp al,1   ;1就是ESC的键盘扫描码  
  85.     jne int9ret  
  86.       
  87.     mov ax,0b800h  
  88.     mov es,ax  
  89.     inc byte ptr es:[160*12+40*2+1]  ;每次按下ESC键加1,来改变颜色属性  
  90.       
  91. int9ret:  
  92.     pop es  
  93.     pop bx  
  94.     pop ax  
  95.     iret  
  96.       
  97.       
  98.   
  99. code ends  
  100.   
  101. end start  
 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器