網上的一些程序似乎做同樣的工作,甚至沒有使用int
指令,,如直接寫入bx800
。在這種情況下,BIOS究竟應該如何知道某些文本是否應該寫入控制檯?是否確保初始中斷髮生?如果是這樣,何時,什麼是做同樣工作的等效流水線(或中斷向量和ah
的組合)?在沒有int 10h的實模式下顯示字符?
回答
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和奇數/偶數模式。
這就是將硬件有效編程爲:將數據移入不同語義的上下文中。
我的理解是你在寫入屏幕時遇到了麻煩。在實模式下,您根本無法訪問任何中斷。您只能寫入視頻內存。以下是我爲您快速輸入的一些代碼。我們希望,這個工程
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(內存指針)視頻存儲器中的位置。 \
*「當處於實模式時,根本無法訪問任何中斷。」*這是完全錯誤的。我不確定你的意思在這裏說... –
我不知道你爲什麼會一次移動一個字節,而不是一個字。如果你使用循環,你可以考慮字符串指令(即STOS)。 –
請注意,您的代碼會出錯。 'edi'超出了64KiB的限制。您需要正確使用分段或設置虛幻模式。 –
- 1. 43行或更多是否有標準的BIOS Int 10h視頻模式?
- 2. 如何在Netbeans的「顯示非打印字符」模式下僅顯示沒有¶的空格(...)?
- 3. INT 10H 13H BIOS字符串輸出不工作
- 4. Bootstrap模式沒有顯示
- 5. Bootstrap模式沒有顯示
- 6. 沒有顯示在我的模式
- 7. QGraphicsPixmapItem在部署模式下沒有在QGraphicsScene中顯示
- 8. Fullcalendar沒有顯示在模式
- 9. Bootstrap模式沒有顯示在點擊
- 10. 訂單模式沒有顯示在Gmail
- 11. 打印C的char *使用INT 10H
- 12. react-select在反應模式下沒有正確顯示資產
- 13. 在Emacs GUD(gdb)模式下顯示ASCII控制字符
- 14. INT水平沒有在短信顯示
- 15. 我的模式沒有顯示
- 16. 在組織模式下顯示帶格式化字符的格式化文本
- 17. 顯示在字符的int,有一些修改
- 18. 基於int值的顯示字符串
- 19. Android中的Gridview沒有顯示字符
- 20. 有沒有什麼方法來轉換字符串模式,如下圖所示?
- 21. 如何在模式下顯示標題下方的模式
- 22. Softkeyboard-橫向模式下的文本不顯示EditText的所有字符
- 23. 遷移後的模型沒有顯示在我的模式中
- 24. 有沒有在真實模式下工作的Linux發行版?
- 25. pygame的:設置視頻模式沒有顯示屏的顯示
- 26. 顯示具有多種格式字的顯示字符串
- 27. 無模式JDialog沒有顯示內容
- 28. Html CSS引導模式沒有顯示
- 29. 有沒有辦法在Unity3d的全屏模式下顯示IME遊戲
- 30. 法國字符沒有以正確的格式顯示
很棒的回答。沒有中斷的幫助,VGA本身會重複檢查自己的內存範圍,並再次繪製整個事物。但是,我必須問你,什麼命令'0xb8000 - 0xbffff'作爲VGA卡的內部存儲器?是傳統的,還是事實標準,還是正式記錄的? – b1sub
@ Il-seobBae這是遺產。範圍實際上從0xa0000開始,即640KiB--原始IBM PC可用的最大內存量。 –
謝謝你的信息。你真的知道你在做什麼!祝你今天愉快。 – b1sub