|
ブートローダその5 汎用レジスタ
|
前回までの内容
これまでで、
- フロッピーのファイルシステムはFAT12
- FAT12では最初のセクタの始めにブートセクタとBPBデータが記録されている
- ブートセクタとBPBをアセンブラで作ってみました
ということがわかりました。ブートローダを作り進める前にCPUについて説明を少し
リアルモードについて少し
前回までで何回か出てきたリアルモードについてここで少し説明します
CPUは起動後リアルモードと呼ばれるモードで動作します。リアルモードでは
16ビットで動作します。当然仮想メモリであるページングなんかの複雑な機能も使えないばかりか
16ビットのモードなので使えるメモリも1MBまでとなっています
16ビット?
先ほどから16ビット、16ビットと書いておりますが一体なにが16ビットなのでしょうか?
それはCPUが処理するデータの基本サイズと思っていただればと思います
例えば足し算するときでも原則的には16ビットどうしのデータで足し算を行います
(もちろん8ビットどうしの足し算など違うサイズのデータを扱う命令もあります)
ですのでデータを記憶する場所も基本的には16ビットの大きさを持っています
この記憶する場所をレジスタといいます
8ビットのCPU(Z8とか)だと当然基本的にレジスタは8ビットの大きさですし、
64ビットのCPUだと基本的には64ビットの大きさになります
レジスタ?
C言語でプログラムを書くときに変数を使われるかと思います
C言語で使う変数のデータはメモリ上に格納されるだけではなくレジスタにも格納されます
図のようにレジスタは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に変わります
レジスタをアセンブラ言語で使うにはそのレジスタの名前を使います
アセンブラ言語でよく使われる命令として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ビットの大きさです
(他にもありますが今回はこのあたりの説明まで)