OS自作入門 / 2008/08/23 (Sat) / 編集 |
OS自作入門2日目よりレジスタの話
ここで、リストの1~4のレジスタには8bit版もあるらしい、というよりも16bitのレジスタを8bitのレジスタ2つとみて使う事ができるらしい。
たとえばアキュムレータ(AX)なら上位8bitをアキュムレータハイ(AH)、下位8bitをアキュムレータロウ(AL)と呼ぶ、つまりAXに「E22F」を代入するというのはAHにE2、ALに2Fを代入するのと同じ事らしい。
ちなみにいうと、32bitのアキュムレータ(つまりEAX)の場合は下位16bitをAXとして使えるらしい、ただし、上位16bitには名前がついておらず使う事はできないんだとか。
あとセグメントレジスタとやらもあるらしい
でもってこのセグメントレジスタってのはなんなのかというと、、、、
16bitのレジスタしか作れなかった時代、レジスタでメモリの番地を表す時16bit分(つまり0x0000~0xffff)までの64KBの番地しか指定できなかったそうで、それだと64MBのメモリとか作ってもまったく意味がない状態に!
そこでセグメントレジスタの出番、番地の指定をするときに「セグメントレジスタの値x16+レジスタの値」にすれば32bit分指定できる!ってことらしい。
*実はEAXなどの32bitのレジスタを使うときにも「メモリの番地を指定するときにはセグメントレジスタも使わなければならない」というルールがあるらしい、でもってアセンブラでセグメントレジスタを省略したときには大抵DSが使われるんだとか、だからアセンブラでプログラムを書くときには「DS=0」にしておく必要があるんだとか
詳しいレジスタの構造については[ITmediaエンタープライズ]x64のレジスタ拡張 (1/2)
- アキュムレータ(Accumulator)(16bitの時はAX):累積演算機
- カウンタ(Counter)(16bitの時はCX)
- データ(Data)(16bitの時はDX)
- ベース(Base)(16bitの時はBX)
- ベースポインタ(Base Pointer)(16bitの時はBP)
- スタックポインタ(Stack Pointer)(16bitの時はSP)
- ソースインデックス(Source Index)(16bitの時はSI):読み込みインデックス
- デスティネーションインデックス(Destination Index)(16bitの時はDI):書き込みインデックス
ここで、リストの1~4のレジスタには8bit版もあるらしい、というよりも16bitのレジスタを8bitのレジスタ2つとみて使う事ができるらしい。
たとえばアキュムレータ(AX)なら上位8bitをアキュムレータハイ(AH)、下位8bitをアキュムレータロウ(AL)と呼ぶ、つまりAXに「E22F」を代入するというのはAHにE2、ALに2Fを代入するのと同じ事らしい。
ちなみにいうと、32bitのアキュムレータ(つまりEAX)の場合は下位16bitをAXとして使えるらしい、ただし、上位16bitには名前がついておらず使う事はできないんだとか。
あとセグメントレジスタとやらもあるらしい
- コードセグメント(Code Segment)(16bitのときはCS)
- スタックセグメント(Stack Segment)(16bitのときはSS)
- データセグメント(Data Segment)(16bitのときはDS)
- エクストラセグメント(Extra Segment)(16bitのときはES)
- 名前なし(16bitのときはFS)
- 名前なし(16bitのときはGS)
でもってこのセグメントレジスタってのはなんなのかというと、、、、
16bitのレジスタしか作れなかった時代、レジスタでメモリの番地を表す時16bit分(つまり0x0000~0xffff)までの64KBの番地しか指定できなかったそうで、それだと64MBのメモリとか作ってもまったく意味がない状態に!
そこでセグメントレジスタの出番、番地の指定をするときに「セグメントレジスタの値x16+レジスタの値」にすれば32bit分指定できる!ってことらしい。
*実はEAXなどの32bitのレジスタを使うときにも「メモリの番地を指定するときにはセグメントレジスタも使わなければならない」というルールがあるらしい、でもってアセンブラでセグメントレジスタを省略したときには大抵DSが使われるんだとか、だからアセンブラでプログラムを書くときには「DS=0」にしておく必要があるんだとか
詳しいレジスタの構造については[ITmediaエンタープライズ]x64のレジスタ拡張 (1/2)
トラックバック
URL :
コメント