1. 程式人生 > >第六篇 鍵盤中斷與應用程式讀取鍵盤緩衝區

第六篇 鍵盤中斷與應用程式讀取鍵盤緩衝區

這篇博文主要介紹在X86下鍵盤的中斷過程,以及應用程式如何利用中斷讀取鍵盤緩衝區內容。

一、撰寫該篇博文的背景介紹

在我們全屏看視訊時,按下Esc鍵,播放器還原或者最小化;在利用其他軟體的時候,我們會

發現,設定可以設定開啟或關閉程式的快捷方式......

應用程式為什麼可以根據鍵盤的指示工作?又是如何工作的呢?

二、對於鍵盤中斷的介紹

當我們在按下按鍵時,鍵盤會把按鍵的掃描碼傳送到主機板的介面電路中,具體說就是埠60H。

當60H收到掃描碼,這時介面就會向CPU發出中斷請求。這是一個可遮蔽中斷。所以,當IF=1,

並且CPU執行完當前指令後就會響應中斷。也就是進入int 9中斷服務程式。此時,程式將讀取

60H中的掃描碼,並判斷輸入的按鍵是什麼。

三、應用程式讀取鍵盤緩衝區

利用鍵盤控制應用程式主要有兩種方式:

1、直接從60H埠中讀取鍵盤掃描碼,在應用程式中分析鍵盤輸入的是字元還是控制符、切換符等。

2、利用BIOS提供的中斷int 16H。

四、介紹本程式

1、功能:當按下按鍵a,螢幕被寫成紅色;再按下shift+a螢幕又恢復成黑色。程式執行過程中,按下其他鍵沒

有響應。

2、本程式是利用BIOS功能呼叫int 16h,讀取鍵盤緩衝區的。

3、通過直接向視訊記憶體寫資料的辦法,改變了螢幕的顏色。

4、程式碼:

int9 equ 09h

data segment
	addr dw ?,?     ;儲存系統int 9的地址
	flag db 0       ;程式結束的標誌,為1表明按下了shift+a,介紹程式
data ends

code segment
	assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax

	mov ax,0
	mov es,ax

	;儲存原中斷地址
	mov ax,es:[int9*4]
	mov addr,ax
	mov ax,es:[int9*4+2]
	mov addr[2],ax

	;設定新中斷地址
	;cli
	;mov word ptr es:[int9*4],offset isr
	;mov word ptr es:[int9*4+2],seg isr
	;sti

	;加入新中斷服務程式地址
	cli
	lea ax,isr
	mov es:[int9*4],ax
	mov ax,seg isr
	mov es:[int9*4+2],ax
	sti


	;等待shift+a,結束程式
back:
	cmp flag,1
	je leave
	jmp back

	;恢復原中斷地址
leave:
	cli
	mov ax,addr
	mov es:[int9*4],ax
	mov ax,addr[2]
	mov es:[int9*4+2],ax
	sti

	mov ah,4ch
	int 21h

;新的中斷服務程式
isr proc far
	push ax
	push bx

	mov ax,data
	mov ds,ax

	;呼叫原int 9完成必要的工作
	pushf
	call dword ptr addr

	;呼叫BIOS的int 16h讀出鍵盤緩衝區的一個位元組
	mov ah,0
	int 16h
	
	;按下a
	cmp al,61h
	je go1

	;按下shift+a
	cmp al,41h
	je go2
back1:
	pop bx
	pop ax
	iret

	;按下a通過bl傳遞視訊記憶體中的字元屬性為高亮紅色		
go1:
	mov bl,48h
	call far ptr display
	jmp back1

	;按下shift+a則恢復
go2:
	mov flag,1
	mov bl,0
	call far ptr display
	jmp back1

isr endp

display proc far
	push cx
	push si

	;向視訊記憶體內寫
	mov cx,0b800h
	mov es,cx
	
	mov cx,2000
	mov si,1
again:
	mov es:[si],bl
	add si,2
	loop again

	pop si
	pop cx
	ret

code ends
	end start

5、實驗結果截圖

①按下a

②按下shift+a

五、博主上傳了王爽《組合語言》。歡迎學習交流。

相關推薦

鍵盤中斷應用程式讀取鍵盤緩衝區

這篇博文主要介紹在X86下鍵盤的中斷過程,以及應用程式如何利用中斷讀取鍵盤緩衝區內容。 一、撰寫該篇博文的背景介紹 在我們全屏看視訊時,按下Esc鍵,播放器還原或者最小化;在利用其他軟體的時候,我們會 發現,設定可以設定開啟或關閉程式的快捷方式...... 應用程式為什麼

作業系統 章 2 中斷 + 裝置驅動程式

1、中斷是I/O系統最低的一層,也是裝置管理的基礎。 2、中斷和陷入 區分:   中斷:CPU對I/O裝置發來的中斷訊號的一種響應,中斷是由外部設備引起的,又稱外中斷。    陷入:由CPU內部事件所引起的中斷,通常把這類中斷稱為內中斷或陷入(tra

函數對象、函數嵌套、名稱空間作用域、裝飾器

max 數據 多分支 數據傳遞 nbsp urn int clas 什麽 一、函數對象 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #4 可以當作容器類型的元素 利用

「Odoo 基礎教程系列」——從 Todo 應用開始(5)

大家好鴨,我又來更新啦!還記得我們在第二篇教程中提到過的動作(actions)嗎,今天我們就來專門講講在 Odoo 中的 action,學習不同型別的動作對應的應用場景,並且在我們的 Todo 應用中使用上其中一些型別的動作。 視窗動作 視窗動作在 Odoo 中是

】Qt學習使用---在qt中列印PDF檔案(不是生成PDF)

1、目的 如題,列印pdf檔案中的內容。 2、思路 (1)思路1:可以通過Poppler類來讀取pdf中的內容,並轉化成圖片,再 列印這些圖片。這個方法的瑕疵是,需要在列印的時候準確的寫出一頁圖片在A4紙上的列印座標和大小。否則會導致與原文不同。 (2)思路2:呼叫系統介面,讓win

【資料結構演算法】之遞迴的基本介紹---

一、遞迴的基本概念 1、定義 遞迴:指的是一個過程,函式直接或者間接的呼叫自己,此時則發生了遞迴。 遞迴的兩個要素:遞推公式和遞迴邊界 可以看到遞迴的定義非常的簡潔,但是理解起來就沒有這麼容易了。不知道大家是否和我一樣,在遇到遞迴問題的時候,總是試圖去一步一步的分

【屌絲程式的口才逆襲演講稿50:兩個年輕人掙錢的故事 【張振華.Jack】

騏驥一躍,不能十步。駑馬十駕,功在不捨。讓我們一起來見證堅持的力量。不知道自己能堅持多久,但我相信堅持就是力量。Java高階交流群:240619787; 演講稿主題:《兩個年輕人掙錢的故事》

元資料資料治理|Spark SQL結構化資料分析(

  資料科學家們早已熟悉的R和Pandas等傳統資料分析框架 雖然提供了直觀易用的API,卻侷限於單機,無法覆蓋分散式大資料場景。在Spark1.3.0以Spark SQL原有的SchemaRDD為藍本,引入了Spark DataFrameAPI,不僅為Scala、Python、Jav

OpenStack部署應用:儀表盤Horizon(轉)

1、儀表盤服務Horizon介紹   Dashboard(horizon)是一個web介面,使得雲平臺管理員以及使用者可以管理不同的Openstack資源以及服務。這個部署示例使用的是 Apache Web 伺服器。   dashboard僅在核心服務中要求認證服務。你可以將dashboard與其他服務,如映

構建之法—

集成 購物 辦公室 電腦 插件 生活 辦公 內容 影響 這周的學習關於典型用戶和場景。 Visual Studio是一個非常成功的軟件開發集成環境,支持項目管理,測試工具,以及第三方的插件。 對於定義典型用戶,我們有不同的需求: 受歡迎的典型用戶和不受歡迎的典型用戶,其中,

Python 學習日記 -- 深淺拷貝

python深淺拷貝: 1、字符串和數字import copy #淺拷貝 copy.copy() #深拷貝 copy.deepcopy() #################################################################################

【滲透課程】-上傳漏洞之解析漏洞

文件的 配置文件 密碼 3.1 安裝目錄 ppa xxx 表單 圖片 上傳漏洞,我們為什麽要上傳?因為我們說過。在網站服務器上 肯定有一個Web容器,它裏面裝的就是Web應用程序 。某些腳本具有一定的執行和修改權限。這些權限可以說是服務器給客戶端訪問時提供的服務的同時提供的

Python開發【】:Python基礎條件和循環

ora back strong als 重復執行 操作 enume 條件表達式 服務 目錄 一、if語句 1、功能 2、語法 單分支,單重條件判斷 多分支,多重條件判斷 if + else 多分支if + elif + else 語句小結 + 案例 三元表達式 二、whil

Spring框架之SpringAOP

lease nco 列表 odi 動態 www implement .get org 一、AOP概述 AOP(Aspect Orient Programming),面向切面編程,是面向對象編程OOP的一種補充。面向對象編程是從靜態角度考慮程序的結構,而面向切面編程是從動態角

SQL Server - 聚集索引 <>

border 包含 運行 子句 連接 去除 樹結構 創建 一行 聚集索引的葉子頁存儲的就是表的數據。因此,表行物理上按照聚集索引列排序,因為表數據只能有一種物理順序,所以一個表只能有一個聚集索引。   當我們創建主鍵約束時,如果不存在聚集索引並且該索引沒有被明確指定為非聚集

xpath的用法

com F12 信息 -1 時間 每次 pos project ole 使用pycharm debug調試效率會比較慢,因為每次調試都需要向url發送請求,等返回信息,scrapy提供一種方便調試的功能,如下: >>>(third_projec

JAVA 章知識回顧總結

方法 eno except 動作 它的 缺點 不能 修飾 擁有 為了克服JAVA單繼承的缺點,JAVA引入了接口: 接口不是類,是對類的一組需求的描述,由常量和一組抽象方法組成;接口中所有方法自動的屬於public,在接口中聲明方法時不必提供關鍵字public,接口中的域自

重構之路——處理概括關系

取代 interface face down 函數 orm 塑造 tor 本體 1 Pull up Field(字段上移) 2 Pull up Method(函數上移) 3 Pull up Constructor Body(構造函數本體上移) 4 Push Down Met

mongodb文章~關於mongodb的自動備份腳本

add use print tar upd dmi log mkdir -p ddr 一 簡介:今天恰好寫了一個關於mongodb的備份腳本,分享下 二 前沿:此腳本適用於單實例和副本集,不適用於分片集群 三 內容: #!/bin/sh user=

接口測試框架——-讀Excel封裝方法

eight 轉碼 hcm hand .get bmf borde code inpu 謝謝@小麥蘋果的提醒,才發現我借口測試少寫了一個文件,今天給大家補上: common->service->excel_case_data.py # coding: utf-8