BIOS功能调用之滚屏与清屏
BIOS功能調用之滾屏與清屏
每次啟動Bochs的時候,顯示出來的那些內容有沒有干擾你的眼球呢?其實我早就想清屏了,今天就來探索一下怎樣利用BIOS中斷來清屏。
清屏都有哪些方法?
1.空格填充法
如果單就”清屏幕”這個問題而言,解決辦法有很多,最最“勤勞”的方法就是在屏幕上顯示25*80的空格。
除了這個,還有什么方法呢?對了,BIOS中斷。它山之石,可以攻玉。
2.滾屏與清除窗口調用
功能號:06H/07H
用 途:窗口內容向上/向下滾動
參 數:AL=要滾動的行數(若是0將清窗口)
BH=填入新行的屬性
CH=滾動窗口的左上角行號
CL=滾動窗口的左上角列號
DH=滾動窗口的右下角行號
DL=滾動窗口的右下角列號
調 用:INT 10H
返 回:無
以上是從網上搜出來的。到底好用不好用呢?試試便知。
實驗一 清除窗口
我們先不考慮滾屏的事情,先看看當AL=0的時候怎么清窗口。
寫個代碼驗證一下。
上面這段代碼的功能清除窗口。窗口的位置由左上角和右下角的坐標指定。
運行結果如圖:
注意,因為沒有可見字符,所以看不到白色的字,但是可以看到藍底。
實驗二 窗口滾動
為了展示窗口滾動的效果,剛才我們繪制的那個藍色窗口肯定不行,一片藍色,不利于觀察。先寫個代碼,讓每一行有不同的顏色。
mov ax,csmov ss,axmov sp,0x7c00 ;set stack and spmov ah,0x06mov al,0mov ch,5 ;(5,5)mov cl,5mov dh,5 ;(5,74)mov dl,74mov bh,0x17 ;藍底白字int 0x10mov ch,6 ;(6,5)mov cl,5mov dh,6 ;(6,74)mov dl,74mov bh,0x27 ;綠底白字int 0x10mov ch,7 ;(7,5)mov cl,5mov dh,7 ;(7,74)mov dl,74mov bh,0x37 ;青底白字int 0x10 mov ch,8 ;(8,5)mov cl,5mov dh,8 ;(8,74)mov dl,74mov bh,0x47 ;紅底白字int 0x10@1: jmp @1times 510-($-$$) db 0db 0x55,0xaa上面的代碼,相當于繪制了4道條紋。效果圖如下:
接下來,我們要添加代碼,讓這個窗口向上滾動。怎樣能看到動態的滾動效果呢?我想到了鍵盤中斷。
以下指令用于從鍵盤讀取一個按鍵:
當ah的內容是0x00時,執行int 0x16后,中斷服務例程會監視鍵盤動作,當它返回時,會在寄存器al中存放按鍵的ASCII碼。
本實驗我們不關心按下哪個鍵,只關心按鍵這個動作。當中斷返回時,說明用戶按鍵了,這時候我們讓窗口上滾一行,這樣4行就變成3行了,最底下這行我們用白色填充。然后再次調用鍵盤中斷,當用戶按鍵后繼續上滾,依然用白色填充最下面一行……當按鍵4次后,窗口被完全滾出,看到的是4行白色。
代碼如下:
當按鍵2次后,執行效果如下圖:
實驗三 清屏
搞明白了以上的實驗,我們終于可以明明白白地清屏了。只需要令AL=0,并且把區域的坐標設置為(0,0)(24,79)即可。
mov ax,csmov ss,axmov sp,0x7c00 ;set stack and spmov ah,0x06mov al,0mov ch,0 ;(0,0)mov cl,0mov dh,24 ;(24,79)mov dl,79mov bh,0x07 ;黑底白字int 0x10@1:jmp @1times 510-($-$$) db 0db 0x55,0xaa執行效果如下圖
果然一片漆黑啊。
3.重置顯示模式
一般的顯卡能支持多種顯示模式(比如大體上可以分為文本模式和圖形模式),程序需要使用何種顯示模式是可以選擇的。這里需要再補充一點,那就是當程序設定顯示模式后,BIOS中斷服務程序會自動的清除整個屏幕,這樣看來重置顯示模式也是一種清屏方法。
設置顯示模式可以使用10H中斷的0號功能:
功能號:00H
用 途:設置顯示模式
參 數:AL = 顯示模式號
調 用:INT 10H
返 回:無
對于AL的取值,我搜到的一部分是
AL=00H:40x25黑白文本方式
AL=01H:40x25彩色文本方式
AL=02H:80x25黑白文本方式
AL=03H:80x25彩色文本方式
……
由于歷史原因,所有在個人計算機上使用的顯卡,在加電自檢之后都會把自己顯示模式設為3,也就是80*25的彩色文本模式。所以如果編程重新選擇顯示模式3,那么就會有”清屏”的效果而且顯示模式沒有改變。
代碼如下,哈哈,只需要3行代碼哦。
實驗四 利用重置顯示模式來清屏
mov ax,csmov ss,axmov sp,0x7c00 ;set stack and spmov ah,0x00mov al,0x03int 0x10@1: jmp @1times 510-($-$$) db 0db 0x55,0xaa結果如下
如果仔細觀察,我們會發現,和實驗三不同的是光標被設置到了0行0列。
(完)
總結
以上是生活随笔為你收集整理的BIOS功能调用之滚屏与清屏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware上的ubuntu14.04与
- 下一篇: 厦门银行服务器没有收到证书,FRM证书申