2017-09-04 102 views
0

網上的一些程序似乎做同樣的工作,甚至沒有使用int指令,,如直接寫入bx800。在這種情況下,BIOS究竟應該如何知道某些文本是否應該寫入控制檯?是否確保初始中斷髮生?如果是這樣,何時,什麼是做同樣工作的等效流水線(或中斷向量和ah的組合)?在沒有int 10h的實模式下顯示字符?

回答

3

BIOS服務用於抽象硬件。
如果您對底層視頻卡有足夠的瞭解,可以直接對其進行編程。

的VGA已被廣泛記載[1] [2] [3],雖然題目是不容易的,學習曲線非常陡峭,由於普遍缺乏適當的引進。
可以提供一個關於本網站上的答案沒有主題的介紹,但可以介紹爲什麼可以繞過BIOS的簡短版本。

該顯卡具有一個內部存儲器,可循環讀取(繪圖是循環業務),以生成模擬信號以驅動顯示器CRT compatible
如果我們知道如何將正確的數據放入內存中,我們將能夠繪製一個角色。

並非CPU地址空間中的所有地址都被系統內存(子系統)回收,範圍0xb8000 - 0xbffff被分配給VGA卡內部存儲器 - 寫入該範圍會將數據存入卡的內部存儲器。

知道如何將一些數據放入卡的內存中,我們仍然必須知道要把什麼放進去。
幸運的是,VGA支持text modes,允許程序員指定一個字符代碼,而不是逐個像素地繪製每個glyph
每個代碼(在行話中,code point - 與所用編碼的代碼單元一致)通過IBM在當時設置的字符集方式(CP437)與字形相關聯。
與代碼點一起,程序員可以指定character attributes,如前景色和背景色。

例如,一旦被啓用文本模式,畫一個藍色在第一列的第一行上的一個只寫:

mov WORD [es:0], 0941h  ;Assuming ES = 0b800h 
           ;09 = Attributes (Blue on black) 
           ;41h = Code point of the glyph A 

每個字符使用兩個字節(一個字)時,第一一個是代碼點,第二個是屬性。
由於x86 endianness 41h(代碼點)將在地址0結束,而屬性將在地址1。

內部的事情比較複雜:請參閱memory layout和奇數/偶數模式。

這就是將硬件有效編程爲:將數據移入不同語義的上下文中。

+0

很棒的回答。沒有中斷的幫助,VGA本身會重複檢查自己的內存範圍,並再次繪製整個事物。但是,我必須問你,什麼命令'0xb8000 - 0xbffff'作爲VGA卡的內部存儲器?是傳統的,還是事實標準,還是正式記錄的? – b1sub

+0

@ Il-seobBae這是遺產。範圍實際上從0xa0000開始,即640KiB--原始IBM PC可用的最大內存量。 –

+0

謝謝你的信息。你真的知道你在做什麼!祝你今天愉快。 – b1sub

0

我的理解是你在寫入屏幕時遇到了麻煩。在實模式下,您根本無法訪問任何中斷。您只能寫入視頻內存。以下是我爲您快速輸入的一些代碼。我們希望,這個工程

mov edi, 0xB8000  ; This will point to the location in ram (b8000 = video mem.) 
mov BYTE [edi], 'H' ; First we declar we are moving a byte, then we move 'H' into video memory. 
mov BYTE [edi+1], 0Fh ; The second byte is always color. This is White on black 
mov BYTE [edi+2], 'i' ; Next print the i 
mov BYTE [edi+3], 0Fh 

我們可以看到這裏是我們第一次移動EDI(內存指針)視頻存儲器中的位置。 \

+4

*「當處於實模式時,根本無法訪問任何中斷。」*這是完全錯誤的。我不確定你的意思在這裏說... –

+0

我不知道你爲什麼會一次移動一個字節,而不是一個字。如果你使用循環,你可以考慮字符串指令(即STOS)。 –

+1

請注意,您的代碼會出錯。 'edi'超出了64KiB的限制。您需要正確使用分段或設置虛幻模式。 –

相關問題