8086 アドレッシング モデルでは、16 ビット セグメントと 16 ビット オフセットを組み合わせてsegment * 16 + offset
.
最小アドレスは000000hで、最大アドレスは10ffefhです。
後者は技術的には 21 ビットの値ですが、CPU には 20 ビットのアドレス バスしかなかったため、アクセス可能な最大のアドレスは0fffffh 1でした。
0fffffhより上のアドレスは単純に2でラップされているため、10ffefhは0ffefhのエイリアスです。
一部のプログラムはそれに依存し始めました。
80286 が登場したとき、アドレス バスは 24 ビットでした。10ffefh
のようなアドレスはラップアラウンドしなくなりました。
当時、古い動作をエミュレートするにはあまりにも多くのトランジスタが必要だったため ( AND で10ffefhをマスクすることはできません)、A20 マスクが導入されました。
名前が示すように、21 番目のビットであるアドレス ライン 20 は、8055/8042 チップの特定のレジスタの特定のビットと AND 演算されます。
BIOS は起動時にそのビットをクリアしたため、21 番目のビットが強制的にゼロになり、古い動作がエミュレートされました。
A20 を有効にしない場合、すべての物理アドレスの 21 番目のビットは常にゼロになります。
「32ビットモード」に最も近いフラットモデルでプロテクトモードでA20を有効にすることは可能ですが、コードをメモリに配置する際には注意が必要です。
x86 アセンブリは、アセンブラーにターゲット サイズを伝えるだけで、16 ビットまたは 32 ビットのコードを生成するために等しく使用できます。
1たとえば、セグメント0f000hとオフセット0ffffhによって指定されます。
2 21 番目のビットは単に破棄されました。
3簡単に言えば、16 ビットまたは 32 ビットのコードを書いている場合です。