「手探りでCUI OS作成に挑む」連載
この記事は「手探りでCUI OS作成に挑む」連載の一部です。
全体の目次は「手探りでCUI OS作成に挑む」連載目次を御覧下さい。
ブートローダー及び読み込まれるコード
次回からkernel.asmの中でOSを実装していきます。
boot.asm
; 第2セクタを読み込み、実行するブートローダー
org 0x7C00
start:
; セグメント初期化
xor ax, ax
mov ds, ax
mov es, ax
; スタック設定
mov ss, ax
mov sp, 0x7C00
; ディスクから第2セクタを 0x7E00 に読み込む
mov ah, 0x02 ; INT 13h サービス 2: 読み込み
mov al, 1 ; 読み込むセクタ数 = 1
mov ch, 0 ; シリンダ = 0
mov cl, 2 ; セクタ番号 = 2(1始まり)
mov dh, 0 ; ヘッド = 0
mov dl, 0 ; ドライブ番号
mov bx, 0x7E00 ; 読み込み先アドレス
int 0x13
jc disk_error ; エラー時に無限ループ
; 読み込んだコードへ跳ぶ(第2セクタ)
jmp 0x0000:0x7E00
disk_error:
jmp $
times 510-($-$$) db 0
dw 0xAA55
第2セクタに格納され、boot.asm
から読み込まれて実行される簡単なコードです。
kernel.asm
org 0x7E00
; セグメント初期化
xor ax, ax
mov ds, ax
; 文字列表示
mov si, msg
.print:
lodsb
test al, al
jz .halt
mov ah, 0x0E
int 0x10
jmp .print
.halt:
jmp $
msg db 'Hello from kernel (2nd sector)!', 0x0D, 0x0A, 0
times 512-($-$$) db 0
動作確認
nasm boot.asm -o boot.bin # コンパイル
nasm kernel.asm -o kernel.bin
cat boot.bin kernel.bin > os.img # 結合
qemu-system-i386 -fda os.img # 起動