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 因為是有鍵和值,所...