8086-4-計算機是如何顯示內容的


計算機是如何顯示內容的

為了讓計算機顯示內容,通常需要兩種硬件,顯示器和顯卡。顯卡是為顯示器提供內容,並控制顯示器的顯示模式和狀態,顯示器的職責是將內容以視覺可見的方式呈現在屏幕上。

顯卡

通常,顯卡是獨立生產、銷售的部件,需要插在主板上才能工作,這種被稱為獨立顯卡也就是常說的獨顯。每台計算機都有主板,它就在機箱內部,有時間你可以打開機箱來觀察一下。 當然,顯卡未必一定是獨立的插卡。為了節省使用者的成本,有的顯卡會直接做在主板上,這樣的顯卡也有個名字,叫集成顯卡也就是常說的集顯。

 

顯存

就和CPU一樣,需要從內存里面讀取東西再來控制。而顯卡也一樣,需要從存儲器里讀取要顯示的內容,然后傳送給顯示器。由以為這個存儲器是給顯卡用的,所有又叫顯示存儲器 (Video RAM:VRAM),簡稱顯存。要顯示的內容都預先先寫到顯存里面。

計算機顯示圖像和文字的基本原理:

顯卡控制顯示器的最小單位是像素,一個像素對應着屏幕上的一個點,通過控制每個像素的明暗和 顏色,我們就能形成文字和圖像:

 

 

顯存里面存放了要顯示的內容也就是像素的數據,然后顯卡周期性地從顯存中提取這些比特,並把它們按順序顯示在屏幕上。

像素:

像素是顯示的最小單元,只要通過像素的多種組合就可以顯示我們想要的內容,比如說顯示一個QQ頭像,和文字內容,但是像素的最基本就是顏色,通過對顏色的處理來控制顯示的內容。因為顏色的不同也有不同的顯示和存儲方式。

黑白色:

只需要把不亮當成比特“0”,亮看成比特“1”。然后將顯存里的每個比特和顯示器上的每個像素對應起來, 就能實現這個目標。

比如:

 

 

這里顯存的內容是:10001011然后對應到顯示器上就是白黑黑黑白黑白白。就可以通過這種組合來顯示內容。

顯示帶有更多顏色的內容:

現在的顯示器可以顯示彩色,彩色的顯示器對應的每個像素的每種顏色都是由紅綠藍三元色組成,每種顏色都有256種的深度(深淺/飽和度)。三個不同顏色的顏色就會合成成一個特定的像素:

 

 

如圖: 左邊這個是早期的陰極射線管,右邊的是現在比較流行的液晶顯示器(LCD Liquid Crystal Display)

也就是說每個像素有 256x265x256 = 16777216種色彩

黑色和白色只需要1 個比特就能表示,但要顯示更多的顏色,1 個比特就不夠了。現在最流行的,是用24 個比特,即3 個字節,來對應一個像素 。 因 為 2的24次方=16777216 , 所 以 在 這 種 模 式 下 ,同 屏 可 以 顯 示 16777216 種顏色,這稱為真彩色。也就是我們平常用的。

注:像素是顯示器上的最小單位是直接顯示的,而對應的比特是顯存里面存放的內容。

然后3個字節中,第一個字節對應於紅元素,第二個字節對應於綠元素,第三個字節對應於藍元素,然后每個字節的大小對應於它們的飽和度。

 

 

 

顯示內容:

前面我們說過,通過對像素的各種排列組合可以顯示出我們想要的內容,比如說顯示一個白色的字母'H',就可以很多個白色的像素組合在一起然后顯示出來。

所以說不管是顯示圖片還是文字還是視頻,對於顯示器來說都沒有什么不同,因為它只需要顯示像素的就行了。

但是如果我們按照一個像素一個像素的拼起來,這樣是非常耗費時間的,而且干的可以說是體力活了,沒啥技術含量。

為了方便,工程師設計出了兩種CPU的運行模式,文本模式和圖像模式這兩種CPU的基本工作模式。這兩種工作模式的顯存是獨立分開的。在不同的工作模式下,顯卡對顯存內容的解釋是不同的,根據不同的規則進行對應。

在文本模式下,顯存的內容是顯示字符所准備的編碼。在圖像模式下顯存的內容是像素的顏色的編碼。

文本模式:

就像一個二進制數既可以是一個普通的數,也可以是一條處理器指令一樣,每個字符也可以和一個數字進行對應。

比如,數字0x4C 就代表字符“L”,這個數被稱為是字 符“L”的ASCII 編碼。ASCII編碼其實就是一種對應規則,就像一元一次函數一樣,每個X對應一個一個y。(當然肯定也有別的編碼規則。)

由於歷史的原因,所有在個人計算機上使用的顯卡,在加電自檢中BIOS會執行一個硬件的初始化把自己初始化到80× 25 的文本模式。在這種模式下,屏幕上可以顯示25 行,每行80 個字符,每屏總共2000 個字符。然后通過字符發生器讀取顯存中保存的內容然后將其顯示到顯示器上。

 

 

為了給出要顯示的字符,CPU需要訪問顯存,來把字符的對應的內容寫進顯存里。但是,顯存是位於顯卡上的,訪問顯存需要和顯卡這個外圍設備打交道。這樣效率就會降低了。

所以,計算機系統的設計者們,決定把顯存映射到CPU可以直接訪問的內存空間。

前面我們說過,8086 可以訪問1MB 的內存空間。其中, 0x00000~9FFFF 屬於常規內存,由內存條來提供;0xF0000~0xFFFFF 由主板上的一個芯片提供,也就是ROM-BIOS。這樣一來,中間還有一個320KB 的空間,也就是0xA0000~0xEFFFF。 傳統上,這段地址空間由特定的外圍設備來提供,其中就包括顯卡

一直以來,0xB8000~0xBFFFF 這段物理地址空間,是給顯卡的,由顯卡來提供,用來顯示文本的。除非顯卡出了毛病,否則這段空間總是可以訪問的。

編寫顯卡文本模式代碼

由於顯示模式的內容保存在內存的0xB8000~0xBFFFF 這段物理地址空間里的,所以我們就直接往這里寫內容就可以了。但是需要遵守對應規則。這里的規則存儲對應規則就是:屏幕上的每個字符對應着顯存中的兩個連續字節,前一個字節是字符的 ASCII 代碼,后一個字節是字符的顯示屬性,包括字符顏色(前景色)和底色 (背景色)。

ASCII:ASCII碼一覽表,ASCII碼對照表 (biancheng.net)

字符顏色:字符的顯示屬性(1 字節)分為兩部分,低4位定義的是前景色,高4位定義的是背景色。色彩主要由R、G、B 決定,畢竟,可以由紅(R)、綠(G)、藍(B)三原色來配出其他所有顏色。K 是閃爍位,為0 時不閃爍,為1 時閃爍;I 是亮度位, 為0時正常亮度,為1 時呈高亮:

 

 

KIRGB的所有可能組合:

 

 

比如要顯示一個白色黑底色的Hello字符串:

 

 

將顏色字節解析出來就是: 0x07 = 0000 0111 對面前面的圖,0000的背景色為黑色,0111對應的前景色為白色。

顯示緩沖區分為8頁,每頁為4KB(約等於4000B)。通常情況下顯示第0頁的內容。和顯存中的內存對照后,也就是會將B8000H~B8F9H中的4000個字節的內容將顯示在顯示器上。

然后來一個簡單的程序試一下:

data segment
    db "Maggie"
data ends
code segment
    assume cs:code,ds:data
start:
    mov dx,11001000B;顯示的字體
    mov ax,0b800H
    mov ds,ax
​
    mov ax,data
    mov es,ax
​
    mov bx,0
    mov si,0
    mov cx,6
loop1:
    mov ax,es:[bx]
    mov [bx],ax
    inc si
    mov [si],dx
    inc si
    inc dx
    loop loop1
​
code ends
end start

 

注,這里只是個簡單的程序,沒有處理成硬盤里面的二進制形式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM