青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

匯編語言--使用BIOS進行鍵盤輸入和磁盤讀寫

 

使用BIOS進行鍵盤輸入和磁盤讀寫

 

大多數有用的程序都需要處理用戶的輸入,鍵盤輸入是最基本的輸入。程序和數據通常需要長期存儲,磁盤是最常用的存儲設備。

BIOS為這兩種外設的I/O提供了最基本的中斷例程。下面將對它們的應用和相關問題進行學習。

 

int 9中斷例程對鍵盤輸入的處理

鍵盤輸入將引發9號中斷,BIOS提供了int 9中斷例程。

CPU9號中斷發生后,執行int 9中斷例程,從60h端口讀出掃描碼,并將其轉化為相應的ASCII碼或狀態信息,存儲在內存的指定空間(鍵盤緩沖區或狀態字節)中。

 

一般的鍵盤輸入,在CPU執行完int 9中斷例程后,都放到了鍵盤緩沖區中。鍵盤緩沖區有16個字單元,可以存儲15個按鍵的掃描碼和對應的ASCII碼。

 

下面我們按照鍵盤緩沖區的邏輯結構,來看一下鍵盤輸入的掃描碼和對應的ASCII碼是如何寫入鍵盤緩沖區的。

 

注意:在我們的課程中,僅在邏輯結構的基礎上,討論BIOS鍵盤緩沖區的讀寫問題。其實鍵盤緩沖區是用環形隊列結構管理的內存區,但我們不對隊列和環形隊列的實現進行討論,因為那是另一門專業課《數據結構》的內容。

 

下面,我們通過下面幾個鍵:

ABCDEshift_AA

的輸入過程,簡要地看一下int 9中斷例程對鍵盤輸入的處理方法:

1)初始狀態下,沒有鍵盤輸入,鍵盤緩沖區空,此時沒有任何元素:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2)按下A鍵,引發鍵盤中斷:CPU執行int 9中斷例程,從60h端口讀出A鍵的通碼;然后檢測狀態字節,看看是否有shiftCtrl等切換鍵按下;發現沒有切換鍵按下,則將A鍵的掃描碼1eh和對應的ASCII碼,即字母“a”的ASCII61h,寫入鍵盤緩沖區。緩沖區的字單元中,高位字節存儲掃描碼,低位字節存儲ASCII碼。此時緩沖區中的內容如下:

1E61

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3)按下B鍵,引發鍵盤中斷:CPU執行int 9中斷例程,從60h端口讀出B鍵的通碼;然后檢測狀態字節,看看是否有切換鍵按下;發現沒有切換鍵按下,將B鍵的掃描碼30h和對應的ASCII碼,即字母“b”的ASCII62h,寫入鍵盤緩沖區。此時緩沖區中的內容如下:

1E61

3062

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4)按下CDE鍵后,緩沖區中的內容如下:

1E61

2062

2E63

2064

1265

 

 

 

 

 

 

 

 

 

 

 

5)按下左shift鍵,引發鍵盤中斷:int 9中斷例程接收左shift鍵的通碼,設置0040:17處的狀態字節的第1位為1,表示左shift鍵按下。

6)按下A鍵,引發鍵盤中斷:CPU執行int 9中斷例程;從60h端口讀出A鍵的通碼;檢測狀態字節,看看是否有切換鍵按下,發現左shift鍵被按下,則將A鍵的掃描碼1Ehshift_A對應的ASCCII碼,即字母“A”的ASCII41,寫入鍵盤緩沖區,此時緩沖區中的內容如下:

1E61

2062

2E63

2064

1265

1E41

 

 

 

 

 

 

 

 

 

 

7)松開左shift鍵,引發鍵盤中斷:int 9中斷例程接收左shift鍵的斷碼,設置0040:17處的狀態字節的第1位為0,表示左shift鍵松開。

8)按下A鍵,引發鍵盤中斷:CPU執行int 9中斷例程,從60h端口讀出A鍵的通碼,然后檢測狀態字節,看看是否有切換鍵按下,發現沒有切換鍵按下,則將A鍵的掃描碼1EhA對應的ASCCII碼,即字母“a”的ASCII61h,寫入鍵盤緩沖區,此時緩沖區中的內容如下:

1E61

2062

2E63

2064

1265

1E41

1E61

 

 

 

 

 

 

 

 

 

 

 

 

使用int 16h中斷例程讀取鍵盤緩沖區

BIOS提供了int 16h中斷例程供程序員調用。int 16h中斷例程中包含的一個最重要的功能是從鍵盤緩沖區中讀取一個鍵盤輸入,該功能的編號為0

下面的指令從鍵盤緩沖區中讀取一個鍵盤輸入,并將其從緩沖區中刪除

mov ah,0

int 16h

結果:(ah)=掃描碼,(al)=ASCII碼。

 

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

1)檢測鍵盤緩沖區中是否有數據;

2)沒有則繼續做第1步;

3)讀取緩沖區第一個字單元中的鍵盤輸入;

4)將讀取的掃描碼送入ahASCII碼送入al

5)將已讀取的鍵盤輸入從緩沖區中刪除。

 

可見,BIOSint 9中斷例程和int 16h中斷例程是一對相互配合的程序,int 9中斷例程向鍵盤緩沖區中寫入,int 16h中斷例程從緩沖區中讀出。

它們寫入和讀出的時機不同,int 9中斷例程是在有按鍵按下的時候向鍵盤緩沖區中寫入數據;而int 16h中斷例程是在應用程序對其進行調用的時候,將數據從鍵盤緩沖區中讀出。

 

我們在編寫一般的處理鍵盤輸入的程序的時候,可以調用int 16h從鍵盤緩沖區中讀取鍵盤的輸入。

 

編程,接收用戶的鍵盤輸入,輸入“r”,將屏幕上的字符設置為紅色;輸入“g”,將屏幕上的字符設置為綠色;輸入“b”,將屏幕上的字符設置為藍色。

 

程序如下:

assume cs:code

code segment

 start:mov ah,0

        int 16h

       

        mov ah,1

        cmp al,'r'

        je red

        cmp al,'g'

        je green

        cmp al,'b'

        je blue

        jmp short sret

       

    red:shl ah,1

 green:shl ah,1

   blue:mov bx,0b800h

        mov es,bx

        mov cx,2000

      s:add byte ptr es:[bx],11111000b

        or es:[bx],ah

        add bx,2

        loop s

       

   sret:mov ax,4c00h

        int 21h

       

code ends

end start

 

 

 

字符串的輸入

用戶通過鍵盤輸入的通常不僅僅是單個字符而是字符串。

最基本的字符串輸入程序,需要具備下面的功能:

1)在輸入的同時需要顯示這個字符串;

2)一般在輸入回車符后,字符串輸入結束;

3)能夠刪除已經輸入的字符。

 

編寫一個接收字符串的輸入子程序,實現上面三個基本功能。

子程序的參數如下:

(dh)(dl)=字符串在屏幕上顯示的行、列位置;

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

 

分析:

1)字符的輸入和刪除。

       每個新輸入的字符都存儲在前一個輸入的字符之后,而刪除是從最后面的字符進行的。

       看下面的過程:

       空字符串:

       輸入“a”:a

       輸入“b”:ab

       輸入“c”:abc

       輸入“d”:abcd

       刪除一個字符:abc

       刪除一個字符:ab

       刪除一個字符:a

       刪除一個字符:

 

       可以看出在字符串輸入的過程中,字符的輸入和輸出是按照棧的訪問規則進行了的,即后進先出。這樣,我們就可以用棧的方式來管理字符串的存儲空間,也就是說,字符串的存儲空間實際上是一個字符棧。字符棧中的所有字符,從棧底到棧頂,組成一個字符串。

 

2)在輸入回車符后,字符串輸入結束。

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

 

3)在輸入的同時需要顯示這個字符串。

       每次有新的字符輸入和刪除一個字符的時候,都應該重新顯示字符串,即從字符棧的棧底到棧頂,顯示所有的字符。

 

4)程序的處理過程。

       1)調用int 16h讀取鍵盤輸入;

       2)如果是字符,進入字符棧,顯示字符棧中的所有字符;繼續執行1

       3)如果是退格鍵,從字符棧中彈出一個字符,顯示字符棧中的所有字符;繼續執行1

       4)如果是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,0b800b

                     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:[dl],’ ‘

                     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

              ret

 

顯示棧中字符的時候,要注意清除屏幕上上一次顯示的內容。

 

完整的接收字符串輸入的子程序:

getstr:     push ax

getstrs:    mov ah,0

              int 16h

 

              cmp al,20h

              jb nochar               ;ASCII碼小于0,說明不是字符

              mov ah,0

              call charstack         ;字符入棧

              mov ah,2

              call charstack         ;顯示棧中的字符

              jmp getstrs

 nochar:cmp ah,0eh            ;退格鍵的掃描碼

              je backspace

              cmp ah,1ch           ;回車鍵的掃描碼

              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

 

 

 

 

應用int 13h中斷例程對磁盤進行讀寫

BIOS提供的訪問磁盤的中斷例程為int 13h

 

入口參數:

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

(al)=讀取的扇區數/寫入的扇區數

(ch)=磁道號

(cl)=扇區號

(dh)=磁頭號(對于軟盤即面號,因為一個面用一個磁頭來讀寫。)

(dl)=驅動器號       軟驅從0開始,0:軟驅A1:軟驅B

                            硬盤從80h開始,80h:硬盤C81h:硬盤D

es:bx指向接收從扇區讀入數據的內存區/將寫入磁盤的數據

 

返回參數:

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

操作失敗:(ah)=出錯代碼

 

以下指令,讀取001扇區的內容到內存單元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

 

以下指令,將0:200中的內容寫入001扇區:

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

 

 

 

 

PC機是如何進入操作系統的?

開機后,CPU自動進入到FFFF:0單元處執行,此處有一條轉跳指令。CPU執行該指令后,轉去執行BIOS中的硬件系統檢測和初始化程序。

 

初始化程序將建立BIOS所支持的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中。

 

硬件系統檢測和初始化完成后,調用int 19h進行操作系統的引導。

如果設為從軟盤啟動操作系統,則int 19h將主要完成以下工作:

1)控制0號軟驅,讀取軟盤001扇區的內容到0:7c00

2)將CS:IP指向0:7c00

 

軟盤的001扇區中裝有操作系統引導程序。int 19h將其裝到0:7c00處后,設置CPU0:7c00開始執行此處的引導程序,操作系統被激活,控制計算機。

 

 

 

posted on 2010-08-04 16:50 luqingfei 閱讀(5157) 評論(1)  編輯 收藏 引用 所屬分類: 匯編語言基礎學習

評論

# re: 匯編語言--使用BIOS進行鍵盤輸入和磁盤讀寫 2011-06-13 19:22 abcgril

您好:
最近在寫一個terminate and stay resident程式
從鍵盤接收"*"(shift+8)
然後會顯示一段字串,如ABCD
但按其他鍵如"8"卻沒有反應

我已經寫出大部分
可以傳給你看看
目前程式是輸入"*"和"8"都會顯示一段ABCD
所以還沒完成!
希望您可以幫忙
或是教我怎樣寫
不知道要怎樣改了
謝謝  回復  更多評論   

導航

<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

統計

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一级片在线观看| 午夜精彩视频在线观看不卡| 亚洲永久精品大片| 亚洲精品视频在线播放| 久久综合一区二区| 久久久一二三| 久久综合色天天久久综合图片| 一本久久青青| 亚洲午夜精品久久久久久app| 中文精品视频| 欧美一区免费| 欧美成人dvd在线视频| 亚洲欧洲日本mm| 欧美日本高清视频| 欧美色欧美亚洲高清在线视频| 欧美三级乱码| 国产精品免费一区豆花| 欧美—级高清免费播放| 国产精品美女主播在线观看纯欲| 国产欧美一区二区白浆黑人| 亚洲高清免费| 亚洲一区二区三区乱码aⅴ| 久久精品99国产精品| 老牛国产精品一区的观看方式| 欧美国产激情二区三区| 亚洲日本视频| 免费成人性网站| 亚洲日韩第九十九页| 亚洲欧美一区二区原创| 欧美精品性视频| 国产精品九九久久久久久久| 国产精品久久久久久久午夜| 狠狠久久亚洲欧美| 亚洲一区二区精品视频| 久久午夜激情| 一区二区三区 在线观看视频| 性做久久久久久久久| 国产精品二区在线观看| 亚洲国产高清aⅴ视频| 亚洲一区二区三区免费视频| 亚洲国产日韩美| 欧美日韩国产一区二区三区地区 | 亚洲三级毛片| 另类av一区二区| 免费成人黄色av| 一本色道久久综合精品竹菊| 欧美护士18xxxxhd| 久久亚洲春色中文字幕| 在线成人国产| 亚洲黄页视频免费观看| 国产精品久久999| 久久噜噜噜精品国产亚洲综合| 欧美在线国产精品| 日韩亚洲国产欧美| 亚洲欧美制服另类日韩| 欧美一区二区三区四区在线观看地址| 国产色婷婷国产综合在线理论片a| 久久久成人精品| 欧美视频在线免费看| 久久视频在线看| 欧美日韩一区二区三区| 久久男人资源视频| 欧美视频一区二区三区| 另类天堂av| 国产欧美1区2区3区| 亚洲国产导航| 在线观看视频一区二区| 亚洲私人影院在线观看| 在线看欧美视频| 午夜精品久久久久久久久| 宅男66日本亚洲欧美视频| 农村妇女精品| 欧美1区视频| 国产一区二区三区四区三区四| 亚洲激情影院| 亚洲九九爱视频| 美日韩精品免费观看视频| 久久亚洲精品一区二区| 国产伦精品一区二区三区免费迷 | 亚洲激情亚洲| 香蕉成人久久| 久久婷婷麻豆| 亚洲国产一区在线| 欧美日韩一区高清| 一区二区三区四区五区视频| 亚洲香蕉网站| 亚洲精品久久久久| 亚洲综合色视频| 欧美日韩大片| 亚洲一区欧美一区| 欧美精品日韩www.p站| 亚洲高清一区二| 欧美一级视频免费在线观看| 国产网站欧美日韩免费精品在线观看| 午夜在线观看免费一区| 亚洲国产影院| 久久精品中文字幕免费mv| 亚洲人精品午夜| 国产日韩精品久久| 欧美视频在线观看免费| 麻豆成人91精品二区三区| 亚洲少妇一区| 日韩视频国产视频| 91久久在线观看| 久久香蕉精品| 狼人社综合社区| 欧美中文字幕视频| 欧美一乱一性一交一视频| 亚洲午夜一区二区| 亚洲在线国产日韩欧美| 在线视频精品一区| 亚洲欧洲精品一区二区三区 | 欧美一区二区三区免费观看视频 | 麻豆乱码国产一区二区三区| 亚洲视频1区2区| 亚洲精品免费在线| 99亚洲一区二区| 一本色道久久加勒比88综合| 亚洲啪啪91| 中文久久乱码一区二区| 亚洲小说欧美另类社区| 亚洲亚洲精品三区日韩精品在线视频| 99精品欧美一区二区三区| 亚洲一区二区视频在线| 亚洲一区免费网站| 新67194成人永久网站| 性欧美xxxx视频在线观看| 老司机精品视频网站| 欧美成黄导航| 亚洲欧美高清| 欧美日本一区二区三区| 久久国产精品99久久久久久老狼| 久久久久女教师免费一区| 免费h精品视频在线播放| 日韩写真在线| 亚洲手机视频| 免费精品视频| 激情av一区| 亚洲欧美综合网| 亚洲精品一区二区三区99| 欧美伊人久久大香线蕉综合69| 免费国产自线拍一欧美视频| 欧美日韩直播| 一二三区精品福利视频| 美国成人直播| 午夜精彩视频在线观看不卡 | 久久午夜精品一区二区| 亚洲国产精品久久精品怡红院| 91久久精品日日躁夜夜躁国产| 亚洲女性裸体视频| 欧美三级欧美一级| 一级日韩一区在线观看| 亚洲国产婷婷| 欧美日韩国产影片| 亚洲一区二区三区国产| 亚洲亚洲精品三区日韩精品在线视频| 欧美日韩精品是欧美日韩精品| 亚洲精品美女在线| 亚洲人成人一区二区在线观看| 欧美高清成人| 午夜影院日韩| 久久久www免费人成黑人精品| 在线播放国产一区中文字幕剧情欧美| 欧美大片免费久久精品三p| 欧美国产高潮xxxx1819| 亚洲无吗在线| 久久久午夜视频| 美女久久网站| 一区二区三区国产盗摄| 欧美一站二站| 亚洲一线二线三线久久久| 久久亚洲欧洲| 久久久久国产精品人| 欧美日韩视频一区二区| 免费观看久久久4p| 国产精品视频yy9099| 亚洲国产美国国产综合一区二区 | 亚洲无线一线二线三线区别av| 一区视频在线| 性久久久久久久| 亚洲永久精品国产| 免费在线观看精品| 农村妇女精品| 影音先锋日韩精品| 欧美怡红院视频| 欧美一区在线直播| 国产精品久久久久久av福利软件| 最近看过的日韩成人| 亚洲国产高清一区| 蜜桃久久av| 欧美激情第1页| 最新成人av网站| 欧美金8天国| 亚洲精品美女久久7777777| 亚洲黄色天堂| 欧美裸体一区二区三区| 亚洲欧美日韩精品久久久| 欧美日韩亚洲一区二区| 亚洲一品av免费观看| 亚洲一区观看|