汇编学习笔记(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