當鍵盤上有鍵按下時,會產生該鍵的掃瞄碼,並被送入埠位址為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...