OS自作入門 三日目

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
ツールボックス

下から選んでください:

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