私はアセンブリ言語の初心者です。私が知っているように、ESP と SS はどちらもスタック レジスタを参照しますが、それらの違いはよくわかりません。
1 に答える
ESP
レジスタは 16 ビット レジスタの 32 ビット バージョンですが、SP
32 ビット アーキテクチャでSS
は無関係です。それでは、最初に 16 ビットについて説明しましょう。32 ビットに関する注意事項は、投稿の最後にあります。
16 ビット Intel x86 アーキテクチャの場合:
SS
スタックセグメントレジスタです。スタックに使用されるメモリのブロックを識別します。SP
スタックポインタレジスタです。これは、特定の瞬間にスタックの「トップ」であるスタック セグメント内の正確な位置を指します。
16 ビットの Intel アーキテクチャには、16 ビットの「セグメント」と 16 ビットの「オフセット」を使用して 20 ビット幅のアドレスを実装するための扱いにくいメカニズムがSS
ありましSP
た。スタックへの実際のオフセット。現在のスタックの場所はSS:SP
.
当然のことながら、セグメント レジスタが 16 ビット幅で、オフセット レジスタが別の 16 ビット幅であるのに、32 ビット幅のアドレスではなく 20 ビット幅のアドレスしか持てなかったのはなぜだろうと思うかもしれません。SS:SP
まあ、これはアーキテクチャが扱いにくい理由の一部です:ペアで表される実際のアドレスはとして計算されず(SS << 16) + SP
、代わりに でした(SS << 4) + SP
。これは、セグメントの重複度が非常に高いことを意味します。各セグメントの長さは 65536 バイトですが、その開始点は前のセグメントの開始点から 16 バイトしか離れていませんでした。したがって、segment:offset
アドレス0:0
は絶対アドレス0
を表し、1:0
アドレスは絶対アドレスを表します16
. (どうやら彼らは、20 ビットを超えるアドレス空間をアドレス指定する必要があるとは考えていなかったようです。)
32ビット
32 ビット アーキテクチャでは、ESP
セグメント レジスタを必要とせずに、レジスタが 32 ビット メモリ アドレス空間全体をアドレス指定できるほど十分に大きいため、そのどれも重要ではありません。したがって、ESP
レジスターを使用している場合は、レジスターについてまったく心配する必要はありませんSS
。