彙編第十七節 使用BIOS進行鍵盤輸入和磁碟讀寫

2021-08-11 13:42:18 字數 4567 閱讀 5508

cpu在9號中斷發生後,執行int9中斷例程,從60h埠讀出掃瞄碼,並將其轉化為相應的ascii碼或狀態資訊,儲存在記憶體的指定空間(鍵盤緩衝區或狀態位元組)中

比如 a鍵的掃瞄碼1eh和對應的ascii碼,即字母』a』的ascii碼61h,寫入鍵盤緩衝區。緩衝區的字單元中,高位位元組儲存掃瞄碼,低位位元組儲存ascii碼

int 16h中斷例程中包含的乙個最重要的功能是從鍵盤緩衝區中讀取乙個鍵盤鍵入,該功能的編號為0。

下面的指令從鍵盤緩衝區中讀取乙個鍵盤輸入,並且將其從緩衝區中刪除:

mov ah,0

int16h

結果:(ah)=掃瞄碼,(al)=ascii碼

int 16h中斷例程的0號功能,進行如下工作:

1.檢測鍵盤緩衝區中是否有資料

2.沒有則繼續做第一步

3.讀取緩衝區第乙個字單元中的鍵盤輸入

4.將讀取的掃瞄碼送入ah,ascii碼送入al

5.將已讀取的鍵盤輸入從緩衝區中刪除

int 9中斷例程和int 16h中斷例程是一對相互配合的程式。

int 9 中斷例程向鍵盤緩衝區寫入,有鍵按下的時候向鍵盤緩衝區中寫入資料。

int 16h 中斷例程從緩衝區中讀出,有應用程式對其進行呼叫的時候,將資料從鍵盤緩衝區中讀出

最基本的字串輸入程式,需具備以下功能:

1.在輸入的同時需要顯示這個字串

2.一般在輸入回車符後,字串輸入結束

3.能夠刪除已經輸入的字元

(dh),(dl)=字串在螢幕上顯示的行,列位置

ds:si指向字串的儲存空間,字串以0為結尾符

分析如下:

1.字元的輸入和刪除:

按照棧的訪問規則進行,後進後出,字元棧中的所有字元,從棧底到棧頂,組成乙個字串

2.在輸入回車符後,字串輸入結束:

輸入回車符後,可以在字串中加入0,表示字串結束

3.在輸入的同時需要顯示這個字串:

每次有新的字元輸入和刪除乙個字元的時候,都應該重新顯示字串。

4.程式的處理過程:

a.呼叫int 16h讀取鍵盤輸入

b.如果是字元,進入字元棧,顯示字元棧中所有的字元;繼續執行a

c.如果是退格鍵,從字元棧中彈出乙個字元,顯示字元棧中所有字元;繼續執行a

d.如果是enter鍵,向字元棧中壓入0,返回

子程式:字元棧的入棧,出棧和顯示

引數說明:

(ah)=功能號,0表示入棧,1表示出棧,2表示顯示

ds:si指向字元棧空間

對於0號功能:(al)=入棧字元

對於1號功能:(al)=返回的字元

對於2號功能:(dh),(dl)=字串在螢幕上顯示的行,列位置

charstack: jmp short charstart

table dw charpush,charpop,charshow

top dw 0

;棧頂charstart:

push bx

push dx

push di

push es

cmp ah,2

ja sret

mov bl,ah

mov bh,0

add bx,bx

jmp word ptr table[bx]

charpush:

mov bx,top

mov [si][bx],al

inc top

jmp sret

charpop: cmp top,0

je sret

dec top

mov bx,top

mov al,[si][bx]

jmp sret

charshow:

mov bx,0b800h

mov es,bx

mov al,160

mov ah,0

mul dh

mov di,ax

add dl,dl

mov dh,0

add di,dx

mov bx,0

charshows: cmp bx,top

jne noempty

mov byte ptr es:[di],' '

jmp sret

noempty:

mov al,[si][bx]

mov es:[di],[al]

mov byte ptr es:[di+2],' '

inc bx

add di,2

jmp charshows

sret:

pop es

pop di

pop dx

pop bx

在顯示棧中字元的時候,要注意清楚螢幕上上一次顯示的內容。寫出完整的接受字串輸入的子程式

getstr: push ax

getstrs:

mov ah,0

int 16h

cmp al,20h

jb nochar ;ascii碼小於20h,說明不是字元

mov ah,0

call charstack ;字元入棧

mov ah,2

call charstack ;顯示棧中的字元

jmp getstrs

nocharl: cmp ah,0eh ;退格鍵的掃瞄碼

je backspace

cmp ah,1ch ;enter鍵的掃瞄碼

je enter

jmp getstrs

backspace:

mov ah,1

call charstack ;字元出棧

mov ah,2

call charstack ;顯示棧中的字元

jmp getstrs

enter:

mov al,0

mov ah,0

call charstack ;0入棧

mov ah,2

call charstack ;顯示棧中的字元

pop ax

ret

3.5英吋軟盤分為上下兩面,每面有80個磁軌,每個磁軌又分為18個扇區,每個扇區的大小為512個位元組

則:2面*80磁軌*18扇區*512位元組=1440kb~~1.44mb

磁碟的實際訪問由磁碟控制器進行,我們可以通過控制磁碟控制器來訪問磁碟,只能以扇區為單元對磁碟進行讀寫。在讀寫扇區的時候,要給出面號,磁軌號和扇區號,面號的磁軌號從0開始,而扇區號從1開始。

bios提供的訪問磁碟的中斷例程為int 13h。

讀取0面0道1扇區的內容到0:200的程式如下

mov ax,0

mov es,ax

mov bx,200h

mov al,1

mov ch,0

mov cl,1

mov dl,0

mov dh,0

mov ah,2

int 13h

入口引數:

(ah)=int 13h的功能號(2表示讀扇區)

(al)=讀取的扇區數

(ch)=磁軌號

(cl)=扇區號

(dh)=磁頭號(對於軟盤即面號,乙個麵用乙個磁頭來讀寫)

(dl)=驅動器號 軟盤從0開始,0:軟碟機a,1:軟碟機b

硬碟從80h,80h:硬碟c,81h:硬碟d

es:bx 指向接受從扇區讀入資料的記憶體區

返回引數:

操作成功:(ah)=0,(al)=讀入的扇區數

操作失敗:(ah)=出錯**

將0:200中的內容寫入0面0到1扇區。

mov ax,0

mov es,ax

mov bx,200h

mov al,1

mov ch,0

mov cl,1

mov dl,0

mov dh,0

mov ah,3

int 13h

入口引數:

(ah)=int 13h的功能號(3表示寫扇區)

(al)=讀取的扇區數

(ch)=磁軌號

(cl)=扇區號

(dh)=磁頭號(對於軟盤即面號,乙個麵用乙個磁頭來讀寫)

(dl)=驅動器號 軟盤從0開始,0:軟碟機a,1:軟碟機b

硬碟從80h,80h:硬碟c,81h:硬碟d

es:bx 指向將寫入磁碟的資料

返回引數:

操作成功:(ah)=0,(al)=寫入的扇區數

操作失敗:(ah)=出錯**

第十七節 K means

sklearn pai from sklearn.cluster import kmeans 聚類的原理 評價指標 輪廓係數,一般 1,1 之間,一般超過0 0.1聚類效果已經十分不錯 輪廓係數api 讀取表prior pd.read csv r e 360downloads software 降維...

第十七節 演算法之二分查詢

c語言程式的經典與否很大在於演算法是否經典,這一節開始朱兆祺帶領大家學習c語言演算法篇。就拿二分查詢下手。text.cpp 定義控制台應用程式的入口點。include stdafx.h int binaryseach int iarray,int key,int n else if iarray i...

第十七節,基本資料型別,其他

enumerate iterable,start 0 自定義列表的下標開始位置 列表變數,要定義的開下標數 預設是0開始的 1 usr bin env python2 coding utf 8 3 a 電腦 滑鼠 鍵盤 顯示器 4 for k,v in enumerate a,1 因為是有鍵和值,所...