30天自製作業系統 第四天 系統介面繪製

2021-10-25 03:33:37 字數 3041 閱讀 9465

out:讓cpu給裝置傳送電訊號.

in:讓cpu從裝置獲取電訊號.

為了區別不同的裝置,要使用裝置號碼,用port表示.

pushad: 將所有的32位通用暫存器壓入堆疊

pusha:將所有的16位通用暫存器壓入堆疊

pushfd:然後將32位標誌暫存器eflags壓入堆疊

pushf::將的16位標誌暫存器eflags壓入堆疊

popad:將所有的32位通用暫存器取出堆疊

popa:將所有的16位通用暫存器取出堆疊

popfd:將32位標誌暫存器eflags取出堆疊

popf:將16位標誌暫存器eflags取出堆疊

今天比較簡單是在第三天基礎上擴充c語言進行畫圖的.

改寫bootpack.c**如下:

vram:儲存的是0xa0000,指的是顯示卡記憶體.這塊記憶體可以像一般的記憶體一樣儲存資料,也可以儲存畫面上的畫素.利用這一點可以在畫面上顯示不同的影象.

void

io_hlt

(void);

void

harimain

(void

)for(;;)}

顯示如下:

rgb表示乙個畫素顏色時需要6位十六進製制數,也就是24位來指定顏色. 而我們顯示這個虛擬顯示屏只有320*200的8位顏色模式.也就是只能使用0-255的數.

這個8位彩色模式,是由程式設計師隨意指定0-255的數字所對應的顏色的,比如25號顏色對應#ffffff,26號顏色對應#123456等,這種方式就叫做調色盤.

目前需要這16種顏色就夠了.

static

unsigned

char table_rgb[16*

3]=;

這個調色模式在上一節中已經說明,呼叫bios函式切換顯示模式,

int 0x10 ,

ah=0x00 設定顯示卡模式,

al=模式,

0x03:16色字元模式,80×25(最基礎)

0x12: vga圖形模式,640×480×4位彩色模式,獨特的4面儲存模式.

0x13:vga圖形模式,320×200×8位彩色模式,調色盤模式.

0x6a: 擴充套件vga圖形模式,800x600x4位彩色模式,獨特的4面儲存模式.

返回值:無

本系統採用0x13。8位彩色模式,就是有程式設計師隨意指定0~255的數字所對應的顏色。如25號顏色對應#ffffff,26號對應#123456,這種方式叫做調色盤palette。

調色盤的訪問步驟:

(1)首先在一連串的訪問中遮蔽中斷(比如cli)。

(2)將想要設定的調色盤號碼寫入0x03c8埠,緊接著,按rgb的順序寫入0x03c9。若還想繼續設定下個調色盤,就省略調色盤的號碼,再按rgb的順序寫入0x03c9就行了。

(3)若想讀出當前調色盤的狀態,首先要將調色盤的號碼寫入0x03c7,再從0x03c9中讀取3次,順序為rgb。若要繼續讀下乙個,則省略調色盤號碼設定,繼續按rgb讀出。

(4)若開始執行了cli,則最後執行sti。

調色盤設定**如下:

void

set_palette

(int start,

int end,

unsigned

char

*rgb)

io_store_eflags

(eflags)

;/* 恢復eflags暫存器的值 */

return

;}

c程式中呼叫的彙編函式如下:

_io_out8:	; void io_out8(int port, int data);

mov edx,[esp+4] ; port dx暫存器通常被稱為資料暫存器。常用來存放雙字長資料的高16位,或存放外設埠位址。

mov al,[esp+8] ; data

out dx,al

ret_io_hlt: ; void io_hlt(void);

hltret

_io_cli: ; void io_cli(void);

cli ;禁止中斷發生

ret_io_sti: ; void io_sti(void);

sti ;允許中斷發生

ret_io_load_eflags: ; int io_load_eflags(void);

pushfd ; push eflags

pop eax

ret_io_store_eflags: ; void io_store_eflags(int eflags);

mov eax,[esp+4]

push eax

popfd ; pop eflags

ret

顏色配好了,現在開始畫,在畫面模式中,畫面上有320x200=64000個畫素,假設坐上角座標是(0,0),右下角座標是(319x199),(書裡為什麼是319x319不明白),那麼畫素座標(x,y)對應的vram位址應該是

0xa0000+x+y*320

畫矩形框函式如下:

void

boxfill8

(unsigned

char

*vram,

int xsize,

unsigned

char c,

int x0,

int y0,

int x1,

int y1)

return

;}

void

harimain

(void

)}

執行效果如下:

30天自製作業系統之 第四天

c語言與畫面顯示的練習 依舊先起個部落格隨筆,目前通過這樣的方式才能讓我保持繼續看這本書的動力。脫了好幾天,差點就又放棄了,趁著國慶放假的日子來從新拾起。第四章的主要內容就是利用c語言呼叫組合語言的畫圖介面,然後在c方法中對螢幕進行繪畫,進而達到一種類似window的圖形化介面的功能。這部分還是涵蓋...

30天自製作業系統

第一天的內容很少,是一些簡單的基礎知識,在這裡我就沒有必要寫出來了,只說出大概的輪廓了,然後我會對其中的幾點進行詳細的解釋。文章的第一天的輪廓大概是這樣的,作者首先用二進位制編輯器做了乙個顯示二進位制的程式,然後用彙編完全db的形式,後又進行改善,最後以比較標準的組合語言編寫,但程式主體部分還沒有翻...

30天自製作業系統 導讀

說明 這是8月15日即將上市的一本新書,本文的摘選也可以命名為 30天自製作業系統 上市之前必讀。本書幽默,有趣,可以說是技術書裡的幽默書,讓您讀起來絕對不會感到乏味。在本書上市之前,您一定先要讀下此篇文章,可以避免在學習中走更多的閱讀彎路,因為更多的讀者會問,七百多頁,30天?是的,看完此篇內容,...