首先需要明白的是螢幕上顯示的內容實際上是記憶體中螢幕緩衝區段中的內容,正如資料段(data segment)中可能存在的內容一樣。兩者的區別僅在於前者的內容經系統處理後,被對映到了螢幕上,而後者卻仍未能得到系統眷顧,對我們來說是「不可見」的。換句話說,如果我們想要在螢幕上顯示什麼,只需向螢幕緩衝區段中寫入相應內容即可。
mov ax,40h
mov es,ax
mov al,byte ptr es:49h ; 40h:49h的地方存放著目前螢幕的狀態,我們用這項資料
;來決定螢幕緩衝區的段位址。
cmp al,07h ; 如果是模式07的話,那麼緩衝區的段位址就在0b000h的地方
jne colormode ; 如果比07小,段位址在0b800h
monomode:
mov ax,0b000h ; 單色模式
colormode:
mov ax,0b800h ; 彩色模式
從以上**中我們就可以確定當前螢幕緩衝區的段位址。下面給出兩個例子,從易到難說明如何操縱螢幕緩衝區。第乙個例子僅在螢幕上顯示乙個字母'a',第二個例子在螢幕**顯示"hello world!":
例一:.model small
.data
char db 'a','$'
.code
.startup
mov ax,40h
mov es,ax
mov al,byte ptr es:49h ; 40h:49h的地方存放著目前螢幕的狀態,我們用這項資料
;來決定螢幕緩衝區的段位址。
cmp al,07h ; 如果是模式07的話,那麼緩衝區的段位址就在0b000h的地方
jne colormode ; 如果比07小,段位址在0b800h
monomode:
mov ax,0b000h ; 單色模式
colormode:
mov ax,0b800h ; 彩色模式
mov di,0;設定緩衝區的目的談起為0,大家可以改變一下它的值看看會有什麼結果哦 嘿嘿
mov si,offset char;將char的首位址存入源變址中
mov al,[si];將ds:si首位址的內容傳送到al
mov es:[di],al;將al中的內容寫入
「螢幕緩衝區」,隨即在螢幕上顯示(這是系統幹的事,與我們無關)
;這是本程式的核心**
.exit 0
end---枯海(
)
win32彙編清空鍵盤緩衝區
可呼叫win32函式flushconsoleinputbuffer 實作方法如下 data consoleinhandle dword 控制台標準輸入控制代碼 code invoke getstdhandle,std input handle 讀取輸入控制代碼,std input handle是wi...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
檔案操作 清空緩衝區
在進行輸入輸出操作或者檔案讀寫時,由於涉及到緩衝區的使用,可能遇到一些問題。例如,scanf 函式用於從stdin輸入資訊,在從標準輸入緩衝區讀取資訊時,往往以 n 作為結束輸入的標誌,但是換行符 n 仍然殘留在緩衝區中,下次再次從標準輸入讀取資訊時,殘留的換行符 n 會被當做有效資訊讀取,即,上一...