汇编学习笔记(12)外中断

概念

外中断,顾名思义是用来处理外部设备输入的中断程序,主要分为两种:

  • 可屏蔽中断:根据标志寄存器IF位的值来判断是否响应,若IF=1,则CPU再执行完当前指令后响应中断;若IF=0则不响应
  • 不可屏蔽中断:CPU必须响应的外部中断,中断码固定为2

键盘输入的处理过程

1.键盘输入:按下一个键产生一个通码,松开一个键产生一个断码,断码=通码+80h
  2.引发9号中断:引发9号中断例程,当然,IF要等于1
  3.执行9号中断:将字符键的扫描码及ASCII码送入BIOS键盘缓冲区,低位字节存储ASCII码,高位字节存储扫描码,若是控制键,将0040:17单元置为相应状态

编写9号中断例程

 1 ;编写int 9号例程,按下F1时改变DOS界面颜色
 2 assume cs:codesg,ss:stack
 3 
 4 stack segment
 5     db 128 dup(0)
 6 stack ends
 7 
 8 
 9 codesg segment
10     
11 start:
12     ;设置栈空间
13     mov ax,stack
14     mov ss,ax
15     mov sp,128
16     ;将原来的9号例程地址保存在0000:01e0
17     mov ax,0
18     mov es,ax
19     push es:[9*4]
20     pop es:[01e0h]
21     push es:[9*4+2]
22     pop es:[01e2h]
23     ;ds:si指向int9
24     push cs
25     pop ds
26     ;安装在0000:01e4开始的内存空间
27     mov si,offset int9
28     mov di,01e4h
29     mov cx,offset int9end-offset int9
30     cld
31     rep movsb
32     ;将中断向量表中9号例程的地址改为新地址
33     cli
34     mov word ptr es:[9*4],01e4h
35     mov word ptr es:[9*4+2],0
36     sti
37     
38     mov ax,4c00h
39     int 21h
40 
41 int9:
42     push ax
43     push bx
44     push cx
45     push es
46     ;读取键盘输入
47     in al,60h
48     pushf
49     ;调用原有9号例程
50     call dword ptr cs:[01e0h]
51     ;判断是否为F1
52     cmp al,3bh
53     jne int9ret
54     mov ax,0b800h
55     mov es,ax
56     mov bx,1
57     mov cx,2000
58 change:
59     inc byte ptr es:[bx]
60     add bx,2
61     loop change
62 int9ret:
63     pop es
64     pop cx
65     pop bx
66     pop ax
67     iret
68 int9end:
69     nop
70 codesg ends
71 
72 end start

 

posted @ 2014-01-28 16:03  huntstack  阅读(207)  评论(0编辑  收藏  举报