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

 

你可能感兴趣的:(学习笔记)