0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他

ブートローダその5 汎用レジスタ

前回までの内容

これまでで、 ということがわかりました。ブートローダを作り進める前にCPUについて説明を少し

リアルモードについて少し

前回までで何回か出てきたリアルモードについてここで少し説明します

CPUは起動後リアルモードと呼ばれるモードで動作します。リアルモードでは

16ビットで動作します。当然仮想メモリであるページングなんかの複雑な機能も使えないばかりか

16ビットのモードなので使えるメモリも1MBまでとなっています

16ビット?

先ほどから16ビット、16ビットと書いておりますが一体なにが16ビットなのでしょうか?

それはCPUが処理するデータの基本サイズと思っていただればと思います

例えば足し算するときでも原則的には16ビットどうしのデータで足し算を行います

(もちろん8ビットどうしの足し算など違うサイズのデータを扱う命令もあります)

ですのでデータを記憶する場所も基本的には16ビットの大きさを持っています

この記憶する場所をレジスタといいます

8ビットのCPU(Z8とか)だと当然基本的にレジスタは8ビットの大きさですし、

64ビットのCPUだと基本的には64ビットの大きさになります

レジスタ?

C言語でプログラムを書くときに変数を使われるかと思います

C言語で使う変数のデータはメモリ上に格納されるだけではなくレジスタにも格納されます

レジスタはCPUの演算部に近く高速。メモリはCPUから遠く低速

図のようにレジスタはCPUの計算する部分(ALU:Arithmetic Logical Unitと言います)と

近いためアクセスする速度が早く、メモリはCPUから遠いためアクセスするのが遅くなります

そのため変数の格納先にはメモリよりも優先的にレジスタを使うコンパイラが多いです

C言語をやってきてもレジスタという名前はなかなか出てこないかと思います

レジスタは基本的にはint型の変数だと思っていただければよいかと思います

ただしC言語の変数みたいに、たくさん変数を使えるといわけではなく使えるレジスタの個数は決まっています

使用できるレジスタの中で何にでも使える(特殊な用途には使えないレジスタもあります)レジスタを

汎用レジスタといいます

汎用レジスタ

IntelのCPUには汎用レジスタが8個用意されています

詳しくは Intelのホームページ からCPUの仕様書が見れますのでぜひダウンロードしておきましょう

Intelのホームページに行って「IA-32アーキテクチャ」にある

「IA-32 インテル アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル」の上巻・中巻・下巻がそうです

ページ数が多いので分からないところやOS開発で詰まったところで適宜読んでいただければと思います

さて、この汎用レジスタには名前が付いています。もちろんメイドインUSAですので英語の名前で、

AX、BX、CX、DX、SI、DI、BP、SPと呼ばれます

それぞれ16ビットサイズのレジスタです

特にAX、BX、CX、DXレジスタは更に8ビットのレジスタとしてアクセスできます

16ビットレジスタの上位8ビットの場合XがHに変わります。下位の8ビットの場合はXがLに変わります

16ビットレジスタの上位8ビットはXがHに下位8ビットはLになる

レジスタをアセンブラ言語で使うにはそのレジスタの名前を使います

アセンブラ言語でよく使われる命令としてMOV命令やADD命令があります


MOV	CX, WORD [BPB_RootEntCnt]

上記のアセンブラ言語の例では前回でてきました”BPB_RootEntCnt”の値をCXレジスタに格納します

例えばC言語で変数に値を格納するとき”=”を使ったと思いますがアセンブラではMOV命令を使います


ADD	AX, 0x0001

また上記の命令ではAXに1を足した値をAXに格納します(1行で1を足して値を格納しています)

これはC言語の変数axがあったとすればax++にあたる命令です

このように汎用レジスタは値を足したり増やしたり、格納したりするときに使うと便利です

汎用レジスタのその他の役割

汎用レジスタは命令によって役割が割り当てられることがよくあります

汎用レジスタの役割
レジスタ 役割
AX 計算結果を保存するレジスタ
BX DSセグメント(後で説明します)のデータに対するポインタ
CX 文字列のポインタやループ(C言語のFor文のようなものです)のカウンタ
DX I/O(Input/Output)ポインタ
SI DSレジスタ(後で説明します)が指すセグメント(後で説明します)内のデータに対するポインタ。 文字列操作では読み取り元のアドレスを指します
DI ESレジスタが指すセグメント内のデータ。文字列操作では保存先のアドレスを指します
SP 最も重要なレジスタです。スタックのポインタとして機能します
BP スタック上のデータに対するポインタ


なにやらよくわからない説明となってますが、とりあえず専用の役割をするときがあると

思っていただくだけでいいかと思います

これに対して特殊用途向けのレジスタとしてCS、DS、SS、ES、FS、GSと呼ばれるセグメントレジスタがあります

このレジスタも同様に16ビットの大きさです

(他にもありますが今回はこのあたりの説明まで)

inserted by FC2 system