セグメント (x86)
読み:セグメント
外語:segment

 Intelが8086で採用したアドレッシング方式で、16ビットを超える広さのアドレス空間にアクセスするための技術。
目次

概要
 1978(昭和53)年に発売された16ビットマイクロプロセッサー8086/8088を開発する際の課題は、従来の8ビットマイクロプロセッサーである8080とプログラムソースの互換性を確保することだった。
 8086は20ビット幅のアドレス空間を持ち、最大で1Miバイトまでのメモリーを扱うことが可能である。しかし、アドレスが20ビットでも汎用レジスターを20ビットにするのは現実的ではないこと、先の8080はアドレス幅が16ビットであったことなどから、レジスターは8080と同じ16ビット長とし、別にセグメントレジスターと呼ばれるものを用意してアドレス領域を拡張することにした。

特徴

アドレッシング
 この手法では、アドレス空間は20ビットだが、通常の命令で使用するアドレス長は8080と同じく16ビットであり、これをオフセットという。
 不足する4ビットを補うため別途セグメントレジスターを組み合わせ、「セグメントレジスターの値×16 + オフセット」が実アドレスとなる。

セグメント
 8086では、CS/DS/SS/ESという4種類のセグメントレジスターが用意されており、メモリーアクセスの種類に応じて各セグメントレジスターが暗黙的に選択される。
 例えば、命令フェッチやジャンプ命令などはコードセグメント(CS)、データの読み書きはデータセグメント(DS)、スタック操作ならスタックセグメント(SS)が自動的に選択されるが、セグメントオーバーライドプリフィックスという命令が用意されており、任意のセグメントレジスターを明示的に選択することもできる。

計算
 実アドレスは「セグメントレジスターの値×16 + オフセット」なので、同じ実アドレスを容易に複数の方法で指定できる。
 例えば、A000:3FF8、A300:0FF8、A2BE:1418 などは、いずれもA3FF8番地を参照している。
 このように同じアドレスを示すのに何通りもの表記方法が生まれてしまうので、この点を指摘し、IntelのCPUはわかりにくいという人が数多く存在した。

再検索