セグメント前回までの内容これまでで、CPUは最初リアルモードと呼ばれる16ビットのモードで動作するAX、BX、CX、DX、SI、DI、BP、SPという汎用レジスタがあり値を格納することができるアセンブラ言語のMOV命令やADD命令で汎用レジスタに値を格納したり演算することができる汎用レジスタは専用の役割を持つことがある汎用レジスタ以外にCS、DS、SS、ES、FS、GSというセグメントレジスタと呼ばれる16ビットのメモリアクセスに使用する特殊なレジスタがある(最後に少しだけ出てきました)ということがわかりました。それでは前回の続きでCS、DS、ES、FS、GSレジスタとメモリアクセスについてセグメントレジスタとメモリアクセスセグメンテーションという言葉を聞いたことがありますでしょうか?まさにそのセグメンテーションのセグメントを指定するレジスタがセグメントレジスタになりますセグメント?セグメントとは、メモリをセグメントと呼ばれるある程度の大きさに区切ったものをいいますブートローダの説明で最初に出てきましたセクタは、ディスクを一定の大きさ(512バイト)に区切ったものでしたセクタと同じようにセグメントもメモリを区切ったものの単位だと考えてくださいただしセクタはそのディスクによって大きさが一定で記録される場所も(物理的に記録されているので)一定ですがセグメントはサイズの上限がありますが、場所を変更したりすることができますそしてセグメントどうしの領域がお互いかぶさるようにすることもできます(同時にはセグメントレジスタの数だけしかセグメントはありません。0x07C0上記のようにMOV命令にセグメントレジスタを指定して値を入れてやればセグメントの開始位置が変わりますただし注意していただきたいのがここで入れたDSの値ですなにやら見たことのある値ですが、そうです、これでセグメントの開始位置が0x7C00になりますセグメントの開始位置セグメントの開始位置はセグメントレジスタで決めるのですが規則がありますセグメントの開始位置=セグメントレジスタに入れた値×16(16進数では0x10)となります。上記での例でいうとDSに0x07C0を入れたのでDSで指定するセグメントはDSのセグメントの開始位置=0x07C0×0x10(10進数では16)=0x7C00と計算でき、DSが指定するセグメントの開始位置は0x7C00となりますこれで位置を決めることができました。それでは大きさはどのようになっているのでしょうか?セグメントの大きさCPUは16ビットで動作し、セグメントの開始位置を決めるセグメントレジスタも16ビットでした同様にセグメントのサイズも16ビットの大きさになりますので0xFFFF(10進数では65535)+1になります(アドレスは0x0000からはじまりますので+1をしています。時計も0時から始まり23時で合計24時間ですね)ここまでのおさらいになりますが、16ビットモードでアクセスできる最大のセグメントのアドレスはどうなるのでしょうかここでDSに16ビットの最大値0xFFFFを入れた場合を考えてみましょうその場合セグメントの開始位置はDSの最大セグメントの開始位置=0xFFFF×0x10=0xFFFF0となります。セグメントの大きさは16ビット最大値の0xFFFFありますので、アクセスできる最大アドレス=0xFFFF0(セグメントの開始位置)+0xFFFF(セグメントの大きさ)=0x10FFEFとなります。図でみるととなります。