メモリは、8086のアセンブリ言語プログラミングで論理アドレスを使用して参照されます。この機能は、最新のPentiumマイクロプロセッサを含むすべてのx86チップに共通ですか?
3 に答える
16 ビットおよび 32 ビットの x86 ライン (8086、8088、80186、80286、80386、i486、Pentium など) はすべて、何らかの形式のセグメント/オフセット アドレス指定を使用します。ただし、セグメントが正確に参照するものは、8086/88/186 行から 80286 以降の行に劇的に変化しました。
以前のチップでは、仮想アドレッシングなしで、セグメントは 20 ビット メモリ アドレスの上位 16 ビットを参照していましたが、オフセットはそれからの 16 ビット オフセットでした。これは、1 MB の直接アドレス指定可能なメモリが、64 KB ブロックの非常に重複する一連のセットを介してアクセスされたことを意味します。
後の「保護モード」チップでは、これが大幅に変更されました。セグメントは単に物理アドレスの上位 16 ビットではなく、ベース アドレス、サイズ制限、保護許可などを指すメモリ構造を含む 2 つのルックアップ テーブル (GDT または LDT) のいずれかへのインデックスです。 . セグメントの. オフセットはその保存されたベースアドレスから機能し、サイズリミッターと照合してチェックされ、その外部のメモリにアクセスしないようにします。したがって、重複するアドレスがある場合は、暗黙的な重複ではなく明示的に設定する必要があります。以前のチップセットの。80286 ではセグメントのサイズが 64KB に制限されていましたが、80386 以降ではそれが完全になくなりました。
セグメントは、引き続きチップによって暗黙的に使用されます。コードは CS セグメントから取得されます (特に明記されていない限り)。データは DS セグメントからフェッチされます (別段の指示がない限り)。ES は、多くの操作で宛先に使用されます (ドリルを知らない限り)。スタックは、SS などを介してアクセスされます。ただし、32 ビット プロセッサ (80286 以降) 上の多くのオペレーティング システム (おそらくすべて?) では、すべてのセグメントが同じメモリ空間にマッピングされているため、フラットなアドレス空間レイアウトを模倣しています。Windows NT 以降用にプログラムする場合、または Linux システムなど用にプログラムする場合は、セグメントについてまったく考えなくても済む可能性があります。
AMD64 の命令はこれとはまた異なり、基本的にはセグメントを完全に排除するための 1 つのステップです。通常、その環境での保護に使用されるのはページング システムです。
32 ビット プロテクト モードまで、すべてのアドレッシングで引き続きセグメント レジスタが使用されます。基本的にはすべて「パススルー」です。すべてのアドレス変換は、代わりにページング ユニットを介して行われます。
64 ビット モードでは、他のオプションのほとんど (とにかく誰も使用しない) は単純に削除されます。セグメントはまだある程度使用されていますが (主に 64 ビット モードと互換モードを切り替えるため)、それだけです。
すべての32ビットx86マシンは、セグメントレジスタのフルセットをサポートし、それらを介してメモリにアクセスします。amd64 / Intel 64チップのサポートはまだ制限されていますが、ほとんどのセグメンテーション機能が削除されています。
ただし、プロテクトモードでは、リアルモードとは異なり、セグメントレジスタが単純にスケーリングされてアドレスに追加されるわけではありません。これらは、GDTまたはLDT(グローバルまたはローカル記述子テーブル)へのインデックスであり、ベース(開始アドレス)とサイズ制限の両方を記述するセグメント記述子、およびセグメントの許可ビットが含まれています。アドレスが制限未満であることがチェックされ、指定されたベースに追加され、アクセスが許可ビットに対してチェックされます。