iT邦幫忙

2023 iThome 鐵人賽

DAY 3
1

嗨我是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


上一篇
【Day 2】拯救豬腳城!我們的project30
下一篇
【Day 4】好不容易寫完的程式不能在實體機器運行,解法是UEFI!
系列文
世界第一簡單的UEFI,實作打造自己的開機畫面31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言