匯程式設計序 按鍵鬆開時中斷的處理

2021-09-21 03:33:19 字數 2957 閱讀 2432

當鍵盤上有鍵按下時,會產生該鍵的掃瞄碼,並被送入埠位址為60h的暫存器中。然後,cpu會接受到9h號中斷,如果該鍵是字元碼,會將掃瞄碼連同字元碼(ascii碼)一起放入緩衝區,而如果該鍵是控制鍵和切換鍵,則會改變記憶體中對應鍵盤狀態的位元組中。

當要為某按鍵設定特別的功能時,可以改寫int 9h的中斷處理程式,也可以呼叫int 16h bios中斷,各種方案,這是學習底層的同學要練的基本功。

問題來了。鍵盤上按下的鍵被鬆開呢?

當鍵被鬆開時,也會產生中斷,這時,送入60h埠的,不叫「掃瞄碼」,而叫「斷碼」。斷碼=掃瞄碼+80h,即1位元組的掃瞄碼最高位均為0,將最高位換1,就是對應鍵的斷碼。

區別僅此而已!

處理按鍵鬆開的技術方案,也就好說了。

參考博文《匯程式設計序:顯示時間中響應鍵盤中斷》,其功能是:「在螢幕的左上角動態顯示時間,期間,按下home鍵後,能顯示』home』,按下end鍵後,退出程式。」

下面的程式,擴充套件功能為「在螢幕的左上角動態顯示時間,期間,按下home鍵後,能顯示』press home』,鬆開時,顯示』unpress home』,按下end鍵後,退出程式。」。

請閱讀程式,可以執行檢視結果來品味。重點看按下home的掃瞄碼為47h,而鬆開home鍵,得到的斷碼是0c7h。

assume cs:code

stack segment

db 128 dup (0)

stack ends

data segment

dw 0,0

home db 'press home',0dh,0ah,'$'

un_home db 'unpress home',0dh,0ah,'$'

data ends

code segment

start:

mov ax,stack

mov ss,ax

mov sp,128

mov ax,data

mov ds,ax

; 改中斷例程入口位址

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

; 顯示時間

show: mov al,2 ;分

out 70h,al

in al,71h

mov ah,al

mov cl,4

shr ah,cl

and al,00001111b

add ah,30h

add al,30h

mov bx,0b800h

mov es,bx

mov byte ptr es:[0],ah

mov byte ptr es:[1],01001111b

mov byte ptr es:[2],al

mov byte ptr es:[3],01001111b

mov byte ptr es:[4],':'

mov byte ptr es:[5],01001111b

mov al,0 ;秒

out 70h,al

in al,71h

mov ah,al

mov cl,4

shr ah,cl

and al,00001111b

add ah,30h

add al,30h

mov bx,0b800h

mov es,bx

mov byte ptr es:[6],ah

mov byte ptr es:[7],01001111b

mov byte ptr es:[8],al

mov byte ptr es:[9],01001111b

jmp show

; 定義中斷例程

int9:

push ax

push bx

push dx

push es

in al,60h

pushf

pushf

pop bx

and bh,11111100b

push bx

popf

call dword ptr ds:[0]

mov bl, al ;儲存al

press_home:

cmp al,47h ; 47h是home鍵的掃瞄碼

jne release_home

;處理home

lea dx, home

mov ah,9

int21h

jmp int9ret

release_home:

cmp al,0c7h ; 0c7h是home鍵的斷碼

jne press_end

;處理home

lea dx, un_home

mov ah,9

int21h

jmp int9ret

press_end:

cmp bl, 4fh ;4fh是end鍵的掃瞄碼

jne int9ret

;處理end,使程式結束,注意在此要恢復中斷向量

mov ax,0

mov es,ax

push ds:[0]

pop es:[9

*4] push ds:[2]

pop es:[9

*4+2]

mov ax,4c00h

int21hint9ret:pop es

pop dx

pop bx

pop ax

iret

code ends

end start

匯程式設計序的Hello world

一 匯程式設計序的hello world x86 at t data msg ascii hello world,hello at t asm n len msg text global start start movl len,edx 顯示的字元數 movl msg,ecx 緩衝區指標 movl ...

匯程式設計序 顯示時間中響應鍵盤中斷

任務 在螢幕的左上角動態顯示時間,期間,按下home鍵後,能顯示 home 按下end鍵後,退出程式。參考解答 assume cs code stack segment db 128 dup 0 stack ends data segment dw 0,0 home db home 0dh,0ah,...

自寫的匯程式設計序

哈哈,今個兒真高興呀!現在特地將自己編的程式掛到部落格上,還請各位高手多多指點!同時也給自己及所有正在研究學習彙編的朋友鼓鼓勁!以下是我自己寫的程式 assume cs codesg data segment db 1975 1976 1977 1978 1979 1980 1981 1982 19...