1. 程式人生 > >【彙編】自定義9號中斷(鍵盤輸入處理中斷)

【彙編】自定義9號中斷(鍵盤輸入處理中斷)

在螢幕上交替顯示a~z,按ESC字型變綠色

  1. assume cs:code,ds:data  
  2. data segment  
  3.     dw 0,0;存放原9號中斷的偏移和段地址  
  4. data ends  
  5. code segment  
  6. ;;;;;;;;;;;;;;;;;;;;;;  
  7. ;主程式  
  8. ;;;;;;;;;;;;;;;;;;;;;;  
  9. start:  
  10.     ;安裝9號中斷  
  11.     mov bx,data  
  12.     mov ds,bx  
  13.     mov bx,0  
  14.     mov es,bx  
  15.     mov ax,es:[9*4]  
  16.     mov ds:[0],ax  
  17.     mov ax,es:[9*4+2]  
  18.     mov ds:[2],ax  
  19.     mov word ptr es:[9*4],offset int9  
  20.     mov es:[9*4+2],cs  
  21.     mov bx,0b800h  
  22.     mov es,bx  
  23.     jmp restore  
  24. s:  mov es:[160*12+2*70],al  
  25.     call delay  
  26.     cmp al,'z'  
  27.     je restore  
  28.     inc al  
  29.     jmp s  
  30.     mov ax,4c00h  
  31.     int 21h  
  32. restore:  
  33.     mov al,'a'  
  34.     jmp s  
  35. delay:  
  36.     push ax  
  37.     push bx  
  38.     mov ax,2000h  
  39.     mov bx,0  
  40. s1: sub bx,1  
  41.     sbb ax,0  
  42.     cmp ax,0  
  43.     jne s1  
  44.     cmp bx,0  
  45.     jne s1   
  46.     pop bx  
  47.     pop ax  
  48.     ret  
  49. ;;;;;;;;;;;;;;;;;  
  50. ;9號中斷  
  51. ;;;;;;;;;;;;;;;;;     
  52. int9:  
  53.     push ax  
  54.     in al,60h  
  55.     cmp al,1  
  56.     jne int9_rtn  
  57.     mov byte ptr es:[160*12+2*70+1],00000010b  
  58. int9_rtn:  
  59.     ;模擬中斷髮生過程  
  60.     pushf;儲存標誌暫存器內容  
  61.     ;設定標誌暫存器的IF,TF為0  
  62.     pushf  
  63.     pop ax  
  64.     and ah,1100b  
  65.     push ax  
  66.     popf  
  67.     call dword ptr ds:[0];完成push cs,push ip  
  68.     pop ax  
  69.     iret  
  70. code ends  
  71. end start 

需要注意的是es的值是0,因為中斷向量表就起始於0地址處,我們知道,中斷向量處理例程是在中斷向量號乘以4,(相對於0這個基址的偏移),就是中斷處理例程的地址,該

地址是16位的,同時在改地址之後的16位,則是改處理例程的段基址,所以在儲存中斷向量處理例程的時候不但要儲存中斷處理例程的地址,還要有其段基址,同樣在安裝鉤

子,更換該處理例程的時候也要注意更換基址!!!