OS自作入門 三日目

「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 ----

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。