web-dev-qa-db-ja.com

x86スタックポインタはどこを指しますか?

たとえば、axをプッシュした場合、[SP]はaxの値またはaxの後のWordを指しますか?また、リアルモードとプロテクトモードは異なりますか? Art of Assemblyの本は、spが最後にプッシュされたデータを指していることを示して説明しているため、このページでは OSDev Wiki-Stack 最後にプッシュされたデータの後に空のWordを指していることを示しています。

15
user1180619

ウィキペディアによると ここ

スタックは、暗黙的にデクリメント(Push)およびインクリメント(pop)スタックポインターを使用して実装されます。 16ビットモードでは、この暗黙のスタックポインタはSS:[SP]としてアドレス指定され、32ビットモードではSS:[ESP]であり、64ビットモードでは[RSP]です。 スタックポインタは、そのサイズがプロセッサの動作モード(つまり、16)と一致するという仮定の下で、実際に格納された最後の値を指します。 32ビットまたは64ビット)を押して、プッシュ/ポップ/コール/レット命令のデフォルト幅に一致させます。

これは私の帰り道の記憶がそれが機能すると言う方法でもあります。

21
Lee Meador
Push eax

と同等です:

sub esp, 4
mov [esp], eax

したがって、プッシュ後、espはプッシュされた値のアドレスを保持します。

16
Cory Nelson

OPがなぜこの質問をしているのか理解できたと思います。最初の変数がSPから8バイトで4ではないのはなぜですか?

いくつかの調査の後、私は this を見つけました。これは次のことを示しています。

SP +0は古いEBPですSP + 4は古いEIP(命令ポインタ)です

したがって、当然、最初のパラメーターはSP +8にあります。

0
Makketronix

LeeMeadorとCoryNelsonの回答によると、スタックポインタは最後にプッシュされた値を指します。

インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル第2巻(2A、2B、および2C):命令セットリファレンスA〜Zから、プッシュ命令の説明の最初の行は次のようになっています。

スタックポインタをデクリメントしてから、ソースオペランドをスタックの最上位に格納します。

0