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にエラーコード |
# アセンブラで作成する関数(抜粋)
[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();
goto fin;
}
3日目の感想
まだまだ分からない部分が多いがアセンブラで作った関数をC言語から呼び出す方法については理解した。