嗨我是k66,上一篇由豬油博士口述介紹了我們的Project30。究竟本系列文的標題UEFI與我們將要實作的Project30開機畫面有什麼關係呢?答案會在接下來兩篇喔!
正文開始! 程式碼連結
小豬Oink: 博士我們要如何設計OS跟loader呢?
豬油博士: 事實上要做出嚇唬人的開機畫面,只需要boot loadaer。我來寫一個最簡單的boot loader示範吧!
我們需要以x86組合語言(Assembly)寫一隻OintBootloader.asm(下稱OinkBL.asm),
再將其透過NASM轉換成為OintBootloader.bin(下稱OinkBL.bin)。
我示範的例子是以x86架構的晶片(市售主流電腦),
而大部分手機及M1、M2晶片的Macbook則是ARM架構。
小豬Oink: 差別在哪?
豬油博士: x86與ARM的組合語言,差異非常大。
小豬Oink: 了解。
豬油博士: 讓我介紹以下這段程式碼:
; OinkBL.asm
org 0x7c00 ; 最前面的32KB-512B(MBR)-512B(data stack)=7C00
section .text
global _start
_start:
; 開始前先清除螢幕畫面(清屏)
xor ax, ax
mov ds, ax
mov es, ax
mov ah, 0x06 ; AH=0x06 清屏
mov al, 0x00 ; AL=0x00 清屏
mov bh, 0x07 ; 顏色,黑底白字
mov cx, 0x00 ; 清屏行數
mov dx, 0x184f ; 清屏的結束位置
int 0x10 ; 呼叫BIOS的int 0x10,執行清屏
; 在屏幕上顯示一條消息
mov ah, 0x0e ; 在TTY下寫字符
mov al, 'N'
int 0x10
mov al, 'o'
int 0x10
; 省略...請練習以int 0x10 mov al, '字母', 自己寫出No pig killing!
; 無窮迴圈
cli ; 禁用中斷
hlt ; 暫停CPU
times 510 - ($-$$) db 0
dw 0xaa55 ; 魔數,表示引導扇區的結束
豬油博士: 這支最簡單的OinkBL.asm程式,會輸出No字樣。
豬油博士: 其中語法: ;分號代表後面是註解,mov ah, 0x06代表AH設為0x06。
豬油博士: 最關鍵的指令:mov al, 'N'、int 0x10[註1],可以輸出N字母,請讀者和Oink練習自己寫出No pig killing!。
小豬Oink: 讓我來試試…我成功了!
豬油博士: 恭喜你Oink,接著我們把剛寫好的OinkBL.asm透過NASM轉成OinkBL.bin。[註2]
# NASM指令,我的版本是2.15.05,請至[註3]安裝
nasm -f bin -o OinkBL.bin OinkBL.asm
豬油博士: 接著理論上我們把asm透過NASM編譯成OinkBootloader.bin放至MBR[註4]的USB中就可以嚇唬城主了!
編譯asm結果在下篇,明天見!
[註1] https://zh.wikipedia.org/zh-tw/BIOS%E4%B8%AD%E6%96%B7%E5%91%BC%E5%8F%AB
[註2] https://zh.wikipedia.org/zh-tw/Netwide_Assembler
[註3] https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/
[註4] 簡單來說,MBR格式對應到舊點的老電腦。GPT格式則是對應到目前市售主流電腦,更多細節可參考:https://zh.wikipedia.org/zh-tw/%E4%B8%BB%E5%BC%95%E5%AF%BC%E8%AE%B0%E5%BD%95