上篇文中我們已經實現了int9中斷例程的編寫,根據課後檢測點我們對上文**做出優化。**如下:
assume cs:code
stack segment
db 128 dup (0)
stack ends
data segment
dw 0, 0
data ends
code segment
start:mov ax, stack
mov ss, ax
mov sp, 128
mov ax, data
mov ds, ax
;儲存原有int 9號中斷處理程式的入口位址
mov ax, 0
mov es, ax
push es:[9*4]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
mov word ptr es:[9*4], offset int9
mov es:[9*4+2], cs
mov ax, 0b800h
mov es, ax
mov ah, 'a'
s1: mov es:[160*12+40*2], ah
call delay
inc ah
cmp ah, 'z'
jna s1
;為了不影響後續的鍵盤輸入處理,需要將int 9號中斷處理程式的入口位址恢復為原來的位址
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
mov ax, 4c00h
int 21h
delay:push ax
push dx
mov ax, 0
mov dx, 1000h ;//cpu迴圈執行10000 000h次
s2:sub ax, 1
sbb dx, 0
cmp ax, 0
jne s2
cmp dx, 0
jne s2
pop dx
pop ax
ret;-----------新的int 9中斷例程-------------
int9: push ax
push bx
push es
in al, 60h ;從埠60h讀出鍵盤的輸入
pushf ;標誌暫存器入棧
;設定if = 0, tf = 0
pushf
pop bx
and bh, 11111100b
push bx
popf
;cs, ip入棧,ip = n*4, cs = n*4+2
call dword ptr ds:[0] ;對int指令進行模擬,呼叫原來的int 9中斷例程
cmp al, 1 ;esc鍵的掃瞄碼為1
jne int9ret
mov ax, 0b800h
mov es, ax
inc byte ptr es:[160*12+40*2 + 1] ;屬性值加1改變顏色
int9ret:pop es
pop bx
pop ax
iret
code ends
end start
仔細分析上面**,可以發現,程式在進入編寫的中斷例程之前if和tf都已經置0,對於程式段
pushf ;標誌暫存器入棧
;設定if = 0, tf = 0
pushf
pop bx
and bh, 11111100b
push bx
popf
;cs, ip入棧,ip = n*4, cs = n*4+2
call dword ptr ds:[0] ;對int指令進行模擬,呼叫原來的int 9中斷例程
可以精簡為:
pushf ;標誌暫存器入棧
;cs, ip入棧,ip = n*4, cs = n*4+2
call dword ptr ds:[0] ;對int指令進行模擬,呼叫原來的int 9中斷例程
另外,在主程式執行過程中,如果在執行設定int9中斷例程的段位址和偏移位址的指令之間發生了鍵盤中斷,則cpu將轉去乙個錯誤的位址執行,將發生錯誤,因此針對這一時間段,我們可以使用sti個cli指令來顯示中斷事件的處理。修改的**如下:
cli ;禁止中斷發生
mov word ptr es:[9*4], offset int9
mov es:[9*4+2], cs
sti ;允許中斷發生
;為了不影響後續的鍵盤輸入處理,需要將int 9號中斷處理程式的入口位址恢復為原來的位址
clipush ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
sti
組合語言 實驗十五 安裝新的int9中斷例程
安裝乙個新的int 9 中斷例程,功能 在dos下,按下 a 鍵後,除非不再鬆開,如果鬆開,就顯示滿螢幕的 a 其他的鍵照常處理。首先要安裝新的中斷處理程式到0 0204h,然後改變入口位址。新的int 9中斷例程中仍要呼叫原來的int 9中斷,pushf call dword ptr cs 200...
int 9和int 16h中斷 鍵盤輸入 讀取
8086pc機當中,鍵盤的輸入將會引發9號中斷,bios提供了int 9的中斷例程。cpu在9號中斷發生之後,會去執行int 9中斷例程,然後從60h埠當中讀取出掃瞄碼,並且將其轉換為相應的ascii碼和狀態資訊,儲存在記憶體的指定的空間 鍵盤緩衝區或狀態位元組 當中 一般的鍵盤輸入,在cpu執行完...
INT 13中斷功能
中斷int13功能及用法分析 int 13h,ah 00h 軟 硬碟控制器復位 說明 此功能復位磁碟 軟盤和硬碟 控制器板和磁碟驅動器,它在磁碟控制器 晶元上完成復位操場作並在磁碟進行所需的操作之前做一系列用於磁碟校準的 磁碟操作。當磁碟i o功能呼叫出現錯誤時,需要呼叫此功能,此刻復位功能將使bi...