「手探りでCUI OS作成に挑む」連載
この記事は「手探りでCUI OS作成に挑む」連載の一部です。
全体の目次は「手探りでCUI OS作成に挑む」連載目次を御覧下さい。
やりたいこと
現在CUIのOSを開発中です。以下は開発中のソースです。
https://github.com/ooe1220/sourouOS/tree/20250628
OS内でCOMファイルを実行する機能を実装する前段階として、NASMで生成したCOMファイルがMS-DOS上で問題なく動作するかを確認します。
MS-DOSでCOMファイルを実行することで、筆者が作成したCOMファイルがMS-DOSの規格に準拠していることを証明できます。
MSDOSの環境
以下の記事で仮想HDDへMSDOSをインストールし、QEMU上で実行する手順を紹介しております。
https://qiita.com/earthen94/items/7491ac22a98e4ae823c9
COMの作成
COMファイルは以下の特徴を持ちます:
- EXEと異なりヘッダがなく単純な構造
- 実行開始アドレスは 0x100 固定
今回は以下のように「Hello, World!」を表示するCOMを作成します。
int 21hはMSDOSのシステムコールであり、AHを通じて呼び出す機能を選択します。
以下は今回使用したシステムコールです。
0009h
:「文字列表示」機能
4C00h
:「プログラム終了」
org 0x100 ; COMは必ず0x100から開始(セグメントは自由)
mov ah, 0009h
mov dx, msg
int 21h
mov ax, 4C00h
int 21h
msg db 'Hello, World!$'
MSDOS上で実行
# コンパイル
nasm -f bin hello.asm -o hello.com
# 空のフロッピーイメージ作成 FAT12で初期化
dd if=/dev/zero of=floppy.img bs=512 count=2880
mkfs.fat -F 12 floppy.img
# フロッピーにhello.comを入れる
sudo mkdir /mnt/floppy
sudo mount -o loop floppy.img /mnt/floppy
sudo cp hello.com /mnt/floppy
sudo umount /mnt/floppy
## QEMUで起動
qemu-system-i386 -fda floppy.img -hda msdos_hdd.img -boot c
起動後、以下のようにAドライブを選択し、COMファイルを実行できます。
Hello, World! が正しく表示されました。
今後の予定
ここからint21hを自力で実装し、COMファイル実行機能を実装していきます。