OS自作入門 on Ubuntu 16.04 (2日目)
2日目の内容は, 1日目 で作成したアセンブラコード(helloos2.s)のプログラム本体をちゃんとアセンブラで実装するようです.プログラム本体は DB 命令でよくわからない16進数のデータを打ち込んでいますが,これは言わば機械語のプログラムです.この機械語のプログラムをちゃんとアセンブラコードとして書いていきましょう. ツールのインストール 1日目に使ったツール以外にインストールするものはありません. helloos5.s への書き換え 16ビットバイナリの生成 2日目のアセンブラの説明を読むと分かるのですが,ここで出てくるアセンブラコードは 16 ビットの命令を前提としています.AX レジスタが 16 ビットというところから分かると思います.ただ,Ubuntu 16.04 で x86_64 版は 64 ビット OS ですので,16 ビット命令として機械語を生成する必要があります.ですので,アセンブラコードの先頭に .code16 という行を追加する必要があります. レジスタの書き方 NASK(NASM)では AX レジスタは単に AX と記述すればよかったのですが,GAS では % をつける必要があります.AX レジスタであれば,%axという具合です. 数値の書き方 NASK(NASM)では単に 0 と書けばよかったのですが,GAS では $ をつけて $0 とします.16進数の場合も同じで,0x0e を GAS では $0x0e と書きます. ORG 命令 コードの最初に出てくる ORG 命令ですが,これに対応する GAS の命令ないようです.無いってどういうこと?と疑問が膨らみますが,どうやら NASK(NASM)と GAS は構文が異なるだけでなく,細かい違いもあるようです. NASK の ORG 命令はプログラムの本体がどこにあるかを指定しますが,GAS ではプログラム中に書くのではなく,アセンブラにオプションとして与える方針です.とりあえずスキップして先に進みましょう.後でこれに対応する方法を書きます. JMP 命令 ORG 命令の下には JMP 命令があります.これは GAS でも同じように jmp entry と書けばOKです.ところで, helloos2.s では JMP