int 9和int 16h中斷 鍵盤輸入 讀取

2021-08-20 06:55:47 字數 1828 閱讀 2410

8086pc機當中,鍵盤的輸入將會引發9號中斷,bios提供了int 9的中斷例程。cpu在9號中斷發生之後,會去執行int 9中斷例程,然後從60h埠當中讀取出掃瞄碼,並且將其轉換為相應的ascii碼和狀態資訊,儲存在記憶體的指定的空間(鍵盤緩衝區或狀態位元組)當中

一般的鍵盤輸入,在cpu執行完int 9 中斷例程之後都放到了鍵盤緩衝區當中,鍵盤緩衝區有16個字單元,可以儲存15個按鍵掃瞄碼和對應的ascii碼,這裡之所以只能放15個是因為鍵盤緩衝區是用環形佇列結構管理的記憶體區域,雖然緩衝區的本身長度為16個字,但出於判斷「對列滿」的考慮,它最多只能儲存15個鍵盤資訊。

環形佇列的關鍵是判斷隊列為空,還是為滿。當tail追上head時,隊列為滿時,當head追上tail時,隊列為空。要知道是滿還是空,可以根據下面的方法來判斷

上面提到了我們使用shift+a的時候,其實輸出到螢幕的是大寫字母a,我在mac下面試驗也是一樣的,說明其實大致的機制都是差不多的

程式如下所示

assume cs:code

code segment

start:

mov ah,0

int 16h

mov ah,1

cmp al,'r'

;要是輸入的是r,就跳到red處

je red

cmp al,'g'

;如果輸入的是g,那麼就跳到green處

je green

cmp al,'b'

;如果輸入的是b,那麼就跳到blue處

je blue

jmp short sret

red: shl ah,1

green: shl ah,1

blue:

mov bx,0b800h ;設定要改變的字元位址處

mov es,bx

mov bx,1

mov cx,2000

s:and byte ptr es:[bx],11111000b ;要改變的是第0、1、2位

or es:[bx],ah

add bx,2

loop s

sret:

mov ax,4c00h

int 21h

code ends

end start

執行結果如下所示

int 9中斷例程優化分析

上篇文中我們已經實現了int9中斷例程的編寫,根據課後檢測點我們對上文 做出優化。如下 assume cs code stack segment db 128 dup 0 stack ends data segment dw 0,0 data ends code segment start mov ...

組合語言 實驗十五 安裝新的int9中斷例程

安裝乙個新的int 9 中斷例程,功能 在dos下,按下 a 鍵後,除非不再鬆開,如果鬆開,就顯示滿螢幕的 a 其他的鍵照常處理。首先要安裝新的中斷處理程式到0 0204h,然後改變入口位址。新的int 9中斷例程中仍要呼叫原來的int 9中斷,pushf call dword ptr cs 200...

Mysql中,int 10 和int 11 的區別

int m m指示最大顯示寬度。最大有效顯示寬度是255。顯示寬度與儲存大小或型別包含的值的範圍無關 首先說一下mysql的數值型別,mysql支援所有標準sql數值資料型別。這些型別包括嚴格數值資料型別 integer smallint decimal和numeric 以及近似數值資料型別 flo...