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時間程度かな?
この記事が気に入ったらサポートをしてみませんか?