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
最終更新:2007年07月24日 19:33