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天?是的,看完此篇內容,...