セグメントアドレスによる1ワードで指定できるメモリアドレスの範囲の拡張

1ワードが16ビットのプロセッサが1ワードで直接指定できるメモリアドレスの範囲は、0~2^[16]]です。

メモリアドレスの範囲が0~2^[20]]であるメインメモリのすべてのメモリアドレスをこのプロセッサが扱うためには、相対アドレスを使って、指定できるメモリアドレスの範囲を拡張する必要があります。

メモリアドレスの範囲を拡張するための相対アドレスの基準となるメモリアドレスは、セグメントベースと呼ばれ、この場合は、0~2^[16]]の範囲にあるメモリアドレスを2^[4]]倍したものとなります。つまり、この場合、セグメントベースは、20ビットとなり、以下のように値が進みます。下位4ビットは常に0です。

セグメントベース(2進数)

00000000000000000000
00000000000000010000
00000000000000100000
00000000000000110000
中略
11101111111111110000
11110000000000000000

(ここでは、最大値のセグメントベースは、16ビットの相対アドレスの余白を残したものとしています。)

よって、メモリアドレスを「セグメントベース+相対アドレス」で指定できます。

なお、この場合、常に0である下位4ビットを除いたセグメントベースの上位16ビットをセグメントアドレスと呼びます。この場合は、「セグメントベース=セグメントアドレス×16」の関係になっています。

この例では、相対アドレスは、0~2^[16]]の範囲で指定できるので、指定できるメモリアドレスの範囲は、「セグメントベース+0~2^[16]]」です。

つまり、セグメントベースを変化させると、以下のように指定できるメモリアドレスの範囲が変化します。

赤色のエリアは、相対アドレスで指定できる範囲であり、セグメントと言います。この例では、以下のように最大で16個のセグメントを作れます。

そして、16個のセグメントベースを切り替えることにより、16個のセグメントを切り替えられます。なお、この場合は、「セグメントベース=セグメントアドレス×16」なので、実際には、セグメントベースは、セグメントアドレスで切り替えます。

セグメントアドレスを切り替えることにより、1ワードで指定できるメモリアドレスの範囲を拡張できました。