【彙編】自定義9號中斷(鍵盤輸入處理中斷)
阿新 • • 發佈:2019-02-10
在螢幕上交替顯示a~z,按ESC字型變綠色
- assume cs:code,ds:data
- data segment
- dw 0,0;存放原9號中斷的偏移和段地址
- data ends
- code segment
- ;;;;;;;;;;;;;;;;;;;;;;
- ;主程式
- ;;;;;;;;;;;;;;;;;;;;;;
- start:
- ;安裝9號中斷
- mov bx,data
- mov ds,bx
- mov bx,0
- mov es,bx
- mov ax,es:[9*4]
- mov ds:[0],ax
- mov ax,es:[9*4+2]
- mov ds:[2],ax
- mov word ptr es:[9*4],offset int9
- mov es:[9*4+2],cs
- mov bx,0b800h
- mov es,bx
- jmp restore
- s: mov es:[160*12+2*70],al
- call delay
- cmp al,'z'
- je restore
- inc al
- jmp s
- mov ax,4c00h
- int 21h
- restore:
- mov al,'a'
- jmp s
- delay:
- push ax
- push bx
- mov ax,2000h
- mov bx,0
- s1: sub bx,1
- sbb ax,0
- cmp ax,0
- jne s1
- cmp bx,0
- jne s1
- pop bx
- pop ax
- ret
- ;;;;;;;;;;;;;;;;;
- ;9號中斷
- ;;;;;;;;;;;;;;;;;
- int9:
- push ax
- in al,60h
- cmp al,1
- jne int9_rtn
- mov byte ptr es:[160*12+2*70+1],00000010b
- int9_rtn:
- ;模擬中斷髮生過程
- pushf;儲存標誌暫存器內容
- ;設定標誌暫存器的IF,TF為0
- pushf
- pop ax
- and ah,1100b
- push ax
- popf
- call dword ptr ds:[0];完成push cs,push ip
- pop ax
- iret
- code ends
- end start
需要注意的是es的值是0,因為中斷向量表就起始於0地址處,我們知道,中斷向量處理例程是在中斷向量號乘以4,(相對於0這個基址的偏移),就是中斷處理例程的地址,該
地址是16位的,同時在改地址之後的16位,則是改處理例程的段基址,所以在儲存中斷向量處理例程的時候不但要儲存中斷處理例程的地址,還要有其段基址,同樣在安裝鉤
子,更換該處理例程的時候也要注意更換基址!!!