1. 程式人生 > >6-如何顯示文字和影象

6-如何顯示文字和影象

通過前面幾篇的學習我們知道處理器加電或復位之後,BIOS-ROM程式就會讀取硬碟的主引導扇區(即0面0道1扇區),並將它載入到0x0000:0x7c00處,即實體地址0x07c00,並判斷是否有效。

一個有效的主引導扇區的最後兩位元組是0x55和0xAA,BIOS-ROM程式會判斷這兩個標誌(非常重要),如果有效就執行jmp 0x0000:0x7c00指令並跳轉到指定的位置繼續執行。把作業系統載入到記憶體,直到作業系統啟動完成。

而本篇我們要做的就是把寫好的彙編程式放到主引導扇區,讓處理器執行並在螢幕上顯示。在此之前,我們需要學習顯示卡和視訊記憶體的知識,瞭解文字是如何顯示在螢幕上的。

 

1. 顯示卡的工作方式

為了顯示文字,通常需要兩種硬體,即顯示器和顯示卡;顯示卡的職責是為顯示器提供內容,並控制顯示器的顯示模式和狀態,顯示器的職責就是把資料以視覺可見的方式呈現在螢幕上。顯示卡(Video card,Graphics card)作為計算機最基本的配件之一,其主要作用是將CPU提供的指令和資料進行相應的處理(即數模訊號轉換),轉換成顯示器能夠接受的文字或圖象後顯示出來。

顯示卡控制顯示器的最小單位是畫素,一個畫素對應螢幕的一個點,通常螢幕上有數十萬甚至更多的畫素,通過控制每個畫素的亮度和顏色,我們就能讓大量的畫素組成文字和美麗的影象。 在我們的顯示器會有一個“解析度”的概念。比如1024*768,把它們互相乘一下,就可以計算出螢幕上有多少個畫素點。

 

那麼顯示卡是如何控制畫素呢?

答案是顯示卡內部都有自己的儲存器,也稱顯示儲存器(Video RAM:VRAM),簡稱視訊記憶體,要顯示的內容都預先寫入視訊記憶體,視訊記憶體跟我們的記憶體結構是一樣的:一個地址編號對應一個位元組儲存單元

對於顯示器來說,顯示黑白影象是最簡單的,只需要控制每個畫素是亮,還是不亮。如果不亮當成位元“0”,亮看成位元“1”,就好辦多了,而這個顯示過程就是數模訊號轉換的過程。

如上圖:

視訊記憶體的第1個位元組對應螢幕左上角連續的8個畫素,在這個位元組中只有前2個位元位為1,所以對應的只有前2個畫素亮了,其他位元不亮。

畫素的第二個位元組對應著螢幕上後續的8個畫素,以此類推……

顯示卡的工作是週期性的從視訊記憶體中提取這些位元,並把它們按順序顯示在螢幕上。當然,黑色和白色只需要1個位元就能表示。但是要顯示更多的顏色,1個位元就不夠了。

 

2. 文字工作模式

剛才所討論的,就是人們常說的顯示卡的圖形模式,但是8086CPU那個時代,計算機的資源,效能十分有限,那時人們只要求計算機能夠顯示文字就行。

需要明白的是,無論是圖片還是文字,顯示器只知道等這些內容都是由螢幕上的畫素點組成的,按照設定的工作模式和視訊記憶體中的資料,點亮螢幕的哪個位置,用什麼顏色點亮而已,當然這個過程非常麻煩,複雜的。

於是,工程師們為了方便又給顯示卡設計了一種工作模式,即“文字模式”,其實文字模式就是對“圖形模式”的封裝,就像組合語言是對機器語言的“封裝”一樣。

 

工程師們就想著,乾脆把字元對應的ascii編碼,直接放到視訊記憶體裡面,第一個程式碼對應著螢幕左上角第一個字元,第二個程式碼對應著螢幕左上角第二個字元,以此類推...... 剩下的工作就是設計一個電路,這個電路根據程式碼來控制區域的畫素點發生亮度變化,這就是字元發生器和控制電路的事情了。

 

視訊記憶體

視訊記憶體是位於顯示卡上的,我們要讓CPU和顯示卡打交道,自然要比和記憶體打交道多一道流程,速度和效率隨之就要慢了很多。特別是後來的電腦為了實現遊戲動畫效果和播放高清電影,必須能夠讓CPU直接讀寫視訊記憶體。為此,設計計算機的工程師決定把視訊記憶體的地址直接對映到記憶體的地址空間裡。

我們知道,8086可以訪問1MB記憶體,其中0x00000 - 0x9FFFF屬於常規記憶體,相當於直接訪問記憶體的資料,0xF0000~0xFFFFF由主機板上的一個晶片提供,即ROM-BIOS。

中間還有320KB的空間,即0xA0000-0xEFFFF。這段地址空間,是留給一些除了記憶體的其他外部裝置,包括顯示卡,因為顯示功能對於現代計算機非常重要。

所以0xB8000 - 0xBFFFF這段實體記憶體地址對映到了顯示卡中的視訊記憶體。處理器總是可以訪問這段空間,如果顯示卡出了毛病怎麼辦?BIOS-ROM自檢(計算機檢查硬體裝置是否正常工作)就不會通過,計算機根本就無法啟動,也不會載入並執行主引導扇區的內容。