我們在之前編寫的int9安裝例程基礎上加一個功能
功能:在DOS下,按F1鍵後改變屏幕當前的顯示顏色,其他的按鍵照常處理。
我們簡單分析一下:
(1)改變屏幕的顯示顏色
我們知道,在80x25的彩色字符模式顯示緩衝區中每頁約有4000個字節的內容顯示在屏幕上,因此程序如下:
mov ax, 0b800h
mov es, ax
mov bx, 1
mov cx, 2000
s: inc byte ptr es:[bx] ;屬性值加1改變顏色
add bx, 2
loop s
(2)其他按鍵照常處理
可以調用原有的int9中斷處理程序
(3)原有int9中斷例程的保存
因爲我們在編寫的int9中斷例程中要調用原來的int9中斷例程,因此要保存原有int9中斷例程,顯然不能保存在安裝程序中,因爲安裝程序返回後地址
將丟失,因此我們將地址保存在0:200單元處
(4)新int9中斷例程
我們將新int9中斷例程安裝在0:204單元處
完整的程序如下:
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax, stack
mov ss, ax
mov sp, 128
push cs
pop ds ;這裏賦值只是用來複制代碼塊
mov si, offset int9
mov ax, 0
mov es, ax
mov di, 204h
mov cx, offset int9end - offset int9
cld
rep movsb
;保存原有int 9號中斷處理程序的入口地址
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4], 204h
mov word ptr es:[9*4+2], 0
sti
mov ax, 4c00h
int 21h
;-----------新的int 9中斷例程-------------
int9: push ax
push bx
push cx
push es
in al, 60h ;從端口60h讀出鍵盤的輸入
pushf ;標誌寄存器入棧
;CS, IP入棧,IP = n*4, CS = n*4+2
call dword ptr cs:[200h] ;對int指令進行模擬,調用原來的int 9中斷例程
cmp al, 3bh ;F1鍵的掃描碼爲3bh
jne int9ret
mov ax, 0b800h
mov es, ax
mov bx, 1
mov cx, 2000
s: inc byte ptr es:[bx] ;屬性值加1改變顏色
add bx, 2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start
程序執行結果:
總結:
(1)外設的輸入送入端口
(2)向cpu發出外中斷(可屏蔽中斷)信息
(3)cpu檢測到可屏蔽中斷信息,如果IF=1,cpu在執行完當前指令後響應中斷,執行相應的中斷例程
(4)可在中斷例程中實現實現對外設輸入的處理。
端口和中斷機制,是cpu進行I/O的基礎。