あんたいとる

無駄の中に宝がある!

30日でできる! OS自作入門(三日目)

32ビットモード突入とC言語導入

新しく学んだ知識

命令について

命令  説明
JC  キャリーフラグが1だったらジャンプする
JNC  キャリーフラグが0だったらジャンプする
JAE  大きいかもしくは等しければジャンプする
JB  小さければジャンプする
INT 0x13 ローレベルなディスクアクセス関係の割込み
INT 0x13について
レジスタ  値  説明
AH 0x02; ディスクからの読み込み
AH 0x03; ディスクへの書込み
AH 0x04; セクタのベリファイ
AH 0x0c; シーク
AL 処理するセクタ数(連続したセクタを処理できる)
CH シリンダ番号 & 0xff
CL セクタ番号(bit0-5) | シリンダ番号 & 0x300) >> 2
DH ヘッド番号
DL ドライブ番号
ES:BS バッファアドレス:(ベリファイr時、シーク時にはこれは参照しない)

戻り値

フラグ 説明
FLAGS.CF == 0 エラーなし、AH == 0
FLAGS.CF == 1 エラーあり、AHにエラーコード

アセンブラで作成した関数をC言語から使う方法

# アセンブラで作成する関数(抜粋)
[FORMAT "WCOFF"]     ; オブジェクフィルを作るモード
[BITS 32]            ; 32ビットモード用の機械語を作る

;オブジェクトファイルのための情報
[FILE "naskfunc.nas"] ;ソースファイル名情報
    GLOBAL _io_hlt    ; このプログラムに含まれる関数名。先頭に_を付ける。

;以下は実際の関数
[SECTION .txt]        ;オブジェクトファイルではこれを書いてからプログラムを書く
_io_hlt:              ; void io_hlt(void);
    HLT
    RET

上記の関数をC言語から呼び出すには次のようにする。

/* 他のファイルで作った関数があるとコンパイラに伝える */
void io_hlt(void);

void HariMain(void)
{
fin:
    io_hlt(); /* これでnaskfunc.nasの_io_hltが実行される */
    goto fin;
}

3日目の感想

まだまだ分からない部分が多いがアセンブラで作った関数をC言語から呼び出す方法については理解した。