1日目の続き

昨日バイナリエディタで直接入力していたものをgasで置き換えます。
1バイトを直接書く命令を使います。一回直接作成しましたが、
skip命令があって便利だったので利用します。

gasの命令

gasの命令をまとめます。

命令 説明
.byte 1byteを直接書く命令
.skip .skip [バイト数], [データ]と使う事で、指定したデータで指定バイト数だけ埋める

helloos.s

上の命令を使って入力

.byte 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
.byte 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
.byte 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
.byte 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
.byte 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
.byte 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
.byte 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
.byte 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
.skip 16, 0x00
.byte 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
.byte 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
.byte 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
.byte 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
.byte 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
.byte 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
.byte 0x6c, 0x64, 0x0a
.skip 379, 0x00
.byte 0x55, 0xaa
.byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
.skip 4600, 0x00
.byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
.skip 1469432, 0x00

アセンブラファイルをコンパイル

as -o os.img helloos.s

出来上がったバイナリを確認

出来上がったOS.imgをhexdumpすると先頭に余分フォーマットが出力されてました。

00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  01 00 03 00 01 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  60 80 16 00 00 00 00 00  34 00 00 00 00 00 28 00  |`.......4.....(.|
00000030  07 00 04 00 eb 4e 90 48  45 4c 4c 4f 49 50 4c 00  |.....N.HELLOIPL.|
00000040  02 01 01 00 02 e0 00 40  0b f0 09 00 12 00 02 00  |.......@........|
〜

Google先生に質問したら、ELFフォーマットで出力されている見たいです。
欲しいのは、バイナリ出力です。
どうするかというと、リンカスクリプトを使うそうです。
lnk.ls

OUTPUT_FORMAT("binary")

再度コンパイル

gcc -nostdlib -o helloos.img helloos.s -Tlnk.ls

実行

qemu -fda helloos.img

とりあえず昨日と同じ実行結果になったのでOKです。