int 9中斷例程優化分析

2021-09-28 19:13:43 字數 2522 閱讀 5736

上篇文中我們已經實現了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...