「OS自作入門 三日目」の編集履歴(バックアップ)一覧はこちら
「OS自作入門 三日目」(2007/07/24 (火) 19:33:49) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*OS自作入門三日目のまとめ
自分のためのまとめなので、他の人には意味不かも。
**セグメントレジスタ
: CS | code segment , 実行中の命令が格納されているセグメントのアドレス。
: DS | data segment , データを格納するセグメントを指定。
MOV AX , [1234]
は
MOV AX , [DS:1234]
のこと。DS*16+1234番地の内容をAXレジスタに読み込むということ。
通常はDS:は省略されるので、DSの値には気をつけなければいけない。
明示的に
MOV AX , [ES:1234]
などとして別のレジスタを指定することも出来る。
: ES | extra segment , DSと同じ。DSのほかに必要なときに使用。ディスクの読み込み時には
ES:BX
として使用。
: SS | stack segment , スタック専用のセグメントのアドレス。
**アセンブラ
: INT 0x13 | interupt , 割り込み。ディスク関係のBIOSを呼び出す。呼び出す前にセットしたレジスタの値によって動作が変わる。
: JAE | jump if above or equal , ジャンプ。比較命令の結果が~以上ならば指定のラベルにジャンプ。
: JNC | jump if not carry , ジャンプ。キャリーフラグが0ならジャンプ。
: JBE | jump if below or equal , ジャンプ。比較命令の結果が~以下ならば指定のラベルにジャンプ。
: JB | jump if below , ジャンプ。比較命令の結果が~より小さければ指定のラベルにジャンプ。
: RET | return , リターン。関数の終わりに書く。関数を終了して呼び出し元に戻る。
**フロッピーディスク
シリンダとセクタで構成されている。シリンダが80個、セクタが16個。これが裏表で2面ある。80シリンダ、18セクタ、2面、1セクタ512バイトなので
80*18*512*2=1474560byte=1440KByte
これでフロッピー1枚分。
**メモリ(物理メモリ)
番地ひとつにつき1byte。
**フロッピーディスクからの読み込み
CLでセクタを指定、ESとBXで番地を指定。
CLは1づつ増加、ESは0x20づつ増加。
CLを1づつ増やすと、読むセクタを順番に指定出来る。
ESを0x20づつ増やすと、読み込む番地を512バイト先に指定できる。
512バイトはフロッピーの1セクタ分。0x20は512を16で割ったものを16進数に直したもの。
なぜ割るかというと、番地の指定を
ES*16+BX
で行うため。番地を512個先に進めるためには
(ES+(512/16))*16+BX = ES*16+512+BX
ということ。
ここではESの足し算は
MOV AX , 0x820
MOV ES , AX
としている。ESにはADD命令できないんだろうか。
**フロッピーディスクへの書き込み
ファイル名は0x002600以降に入るらしい。
ファイルの中身は0x004200以降に入るらしい。
**C言語の説明
省略
**C言語からアセンブラ呼び出し
[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[BITS 32] ; 32ビットモード用の機械語を作らせる
オブジェクトファイルのための情報
[FILE "naskfunc.nas"] ; ソースファイル名情報
GLOBAL _io_hlt ; このプログラムに含まれる関数名
以下は実際の関数
[SECTION .text] ; オブジェクトファイルではこれを書いてからプログラムを書く
_io_hlt: ; void io_hlt(void);
HLT
RET
----
*OS自作入門三日目のまとめ
自分のためのまとめなので、他の人には意味不かも。
**セグメントレジスタ
: CS | code segment , 実行中の命令が格納されているセグメントのアドレス。
: DS | data segment , データを格納するセグメントを指定。
MOV AX , [1234]
は
MOV AX , [DS:1234]
のこと。DS*16+1234番地の内容をAXレジスタに読み込むということ。
通常はDS:は省略されるので、DSの値には気をつけなければいけない。
明示的に
MOV AX , [ES:1234]
などとして別のレジスタを指定することも出来る。
: ES | extra segment , DSと同じ。DSのほかに必要なときに使用。ディスクの読み込み時には
ES:BX
として使用。
: SS | stack segment , スタック専用のセグメントのアドレス。
**アセンブラ
: INT 0x13 | interupt , 割り込み。ディスク関係のBIOSを呼び出す。呼び出す前にセットしたレジスタの値によって動作が変わる。
: JAE | jump if above or equal , ジャンプ。比較命令の結果が~以上ならば指定のラベルにジャンプ。
: JNC | jump if not carry , ジャンプ。キャリーフラグが0ならジャンプ。
: JBE | jump if below or equal , ジャンプ。比較命令の結果が~以下ならば指定のラベルにジャンプ。
: JB | jump if below , ジャンプ。比較命令の結果が~より小さければ指定のラベルにジャンプ。
: RET | return , リターン。関数の終わりに書く。関数を終了して呼び出し元に戻る。
**フロッピーディスク
シリンダとセクタで構成されている。シリンダが80個、セクタが16個。これが裏表で2面ある。80シリンダ、18セクタ、2面、1セクタ512バイトなので
80*18*512*2=1474560byte=1440KByte
これでフロッピー1枚分。
**メモリ(物理メモリ)
番地ひとつにつき1byte。
**フロッピーディスクからの読み込み
CLでセクタを指定、ESとBXで番地を指定。
CLは1づつ増加、ESは0x20づつ増加。
CLを1づつ増やすと、読むセクタを順番に指定出来る。
ESを0x20づつ増やすと、読み込む番地を512バイト先に指定できる。
512バイトはフロッピーの1セクタ分。0x20は512を16で割ったものを16進数に直したもの。
なぜ割るかというと、番地の指定を
ES*16+BX
で行うため。番地を512個先に進めるためには
(ES+(512/16))*16+BX = ES*16+512+BX
ということ。
ここではESの足し算は
MOV AX , 0x820
MOV ES , AX
としている。ESにはADD命令できないんだろうか。
**フロッピーディスクへの書き込み
ファイル名は0x002600以降に入るらしい。
ファイルの中身は0x004200以降に入るらしい。
**C言語の説明
省略
**C言語からアセンブラ呼び出し
[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[BITS 32] ; 32ビットモード用の機械語を作らせる
オブジェクトファイルのための情報
[FILE "naskfunc.nas"] ; ソースファイル名情報
GLOBAL _io_hlt ; このプログラムに含まれる関数名
以下は実際の関数
[SECTION .text] ; オブジェクトファイルではこれを書いてからプログラムを書く
_io_hlt: ; void io_hlt(void);
HLT
RET
----