OSの作り方:2日目

まずテキストエディタの紹介。・・・ってバイナリエディタより後の紹介。TeraPadのおススメでしたがわたくしは秀丸派。

さっそくアセンブラなのですが。

ORG 0x7c00 が冒頭に出てくる。7c00にこのプログラムを配置しなさい、という命令。なぜ0x7c00?仮想メモリの概念はないから物理メモリのアドレスだよね。

そして次に JMP entry でラベルentryを実行開始、と。で、レジスタのAX,SS,DS,ESを0で初期化。SPは0x7c00で初期化。直値命令MOVで指定。スタックは0x7c00なの?このPGMの配置と同じ???

Intelの汎用レジスタは、AX、CX、DX、BX、SP、BP、SI、DIがある。

AX:計算用のレジスタ、CX:カウンタ、DX:データ、BX:ベース、SP:スタック、BP:ベースポインタ、SI:ソースインデックス、DI:デスティネーションインデックス。大体の用途は理解。それぞれ16bit。AX、BX、CX、DXは8bit指定ができて、AL、BL、CL、DLが下位8ビット、AH、BH、CH、DHが上位8ビットを意味する(あくまでアセンブラ上)。32bitの場合は、EAX、のように頭にEをつける。じゃ64bitは・・・?は不明。

他にも、ES,CS,SS,DS,FS,GSのセグメントレジスタがある。Windowsもだけど、セグメントの概念があるようでない。フルの領域が確か指定されていたはず。コードセグメント、データセグメントなどの範囲がフル。だから、データ領域にコード記述してJUMP出来るわけだし、スタックオーバーフローを利用して脆弱性が生まれるわけだし。

さて、メモリのアドレスからレジスタに読むときは、MOV AL,[SI]のように、SIレジスタに格納されている数値をメモリアドレスとして、メモリから読み込む、という意味になる。[]でくくるとメモリ上の、という意味。リトルインディアンであることも注意だなぁ。

番地指定には、BX、BP、SI、DIレジスタでしか使えないらしい。AX、CX、DXは不可。へーそうなんだ。

そして条件分岐。CMP AL,0 では、ALレジスタと0を比較せよ。ということ。結果はフラグレジスタに記録されている。

そして、画面表示のためのBIOS呼び出し。ここ一番興味ある。

INT 0x10 がビデオカードの機能を呼び出す割込みのようだ。

AH=0x0e、AL=出力文字(1バイト)、BH=0、BL=カラーコード を指定すれば、ALで指定した文字が出力されるみたい。こういう使い方なんだ。カラーコード15は白?

で、指定文字列を表示したら、HLTでCPUを停止させる、と。

最初に戻って、0x7c00になぜ配置するか。説明によると、0番地付近はBIOSの計算領域だし、0xf0000あたりはBIOSそのものがメモリアドレスにマッピングされているらしい。で、ブートセクタが読み込まれるメモリアドレスが0x7c00のようで、これはもう決まりごとだからしょうがない。

そして、今後の開発環境を整えるために、Makefileを使ったアセンブルの自動化を。やりやすくなった。

ひとまずこれで2日目終了。1時間程度かな?

この記事が気に入ったらサポートをしてみませんか?