セグメントとオフセット
8086のアドレス指定
さて、いよいよメモリのアドレスに関係する話をしましょう
屈強なコンピュータ科学やCの低水準なプログラムを熟知している読者ならば
ここで解説するレジスタやアドレスバスと物理アドレスの関係も理解できるでしょう
8086は、残念ながら(?)機械語を持ってすら物理アドレスは指定できません
物理アドレスはハードウェアレベルでメモリアドレスを考える時に用いられるものです
そこで、8086 プロセッサはセグメント方式と呼ばれるアドレス指定方式を採用しています
これは、二つのアドレスによって相対的に物理アドレスを定める方式です
ここで使われるアドレスがセグメントアドレスとオフセットアドレスです
まず、DEBUGで実際のセグメントアドレスとオフセットアドレスをご覧ください
色分けしてみましたが、次のようにアドレスが表示されています
赤いほうがセグメントアドレス、青いほうがオフセットアドレスです
この二つの論理アドレスを計算することで、物理アドレスを割り出すこともできます
セグメントアドレスの役割は、アドレスを指すために基準点となることです
これをセグメントベースと呼びます
上のアドレスのセグメントベースは 15F20 になります
このセグメントベースは16進数で5桁なので、最大で10進数 0〜1048575 までの数を表せ
結果として 1Mバイト までのアドレスを表すことができます
セグメントベースは、プログラムが利用するメモリへのアドレスの基本となります
AコマンドやGコマンドで指定しているのは、すでにわかっていると思いますが「オフセット」アドレスです
このオフセットアドレスは、セグメントベースから相対的にメモリを指定します
オフセットアドレスは、4桁の16進数で表現されます
符号無しで 0〜65535 まで(つまり65536通り)表現することができます
つまり、オフセットアドレスでは64Kバイトまで表現できるのです
セグメント方式では、セグメントベースを固定しオフセットアドレスで相対的にアドレス指定します
こうすることで、大規模なメモリでも無駄な演算を極力省くことができ速度の向上が期待できます
物理アドレスは、最終的にセグメントベースとオフセットアドレスを加算した数値になります
15F20 + 0100 = 16020
これが実際にCPUがアクセスする物理アドレスです
物理アドレスが5桁で構成されるのは、アドレスバスの本数が20本だからです
セグメントベースが指すアドレスは、メモリ全体の一部であり
セグメントベースから64Kバイト分(オフセットアドレスの範囲)をセグメントと呼びます
オフセットアドレスが表すアドレスは、常にセグメントのアドレスです