8086 マイクロプロセッサのスタックがいっぱいで、それでも何かをプッシュした場合の動作はどうなりますか?
3 に答える
8086では、PUSH命令または暗黙のスタックプッシュにより、SPレジスタが2つデクリメントされ、適切な量がSS:SP(つまり、16 * SS + SP)に格納されます。SPレジスタが$0000の場合、データはSS:$FFFEに送られます。SPレジスタが$0001の場合、データのMSBはSS:$ 0000になり、LSBはSS:$FFFFになります。プロセッサは、スタックのラップアラウンドについて特別な通知を行いません。スタックのラップアラウンドは通常は悪いことですが、8086には、無視しても何の影響も及ぼさない状況がいくつかあります。たとえば、SSが他に必要のない64KのRAMを指している場合、スタックをリセットせずに「main()」を呼び出すだけで、終了しないプログラムが再起動することがあります。プログラムの動作に影響を与える、
80386以降のプロセッサでは、スタックアンダーフローの動作が変更されていることに注意してください。PUSH、CALLなどは、16ビットではなく32ビット(または64ビット)のアドレス計算を使用し、それらは$FFFFではなく$FFFFFFFF(または$ FFFFFFFFFFFFFFFF)にラップされます。
8086には「保護モード」がないため、「スタックの下部にあるガードページ」がないため、明確に定義された例外はありません。代わりに、プッシュはスタックの一番下にあるコードまたはデータを上書きし、そのコードが実行された場合、またはそのデータが使用された場合、最終的に (ただしすぐではありません) 「未定義の動作」が発生します。
終わりはありません。つまり、これらのプロセッサのスタックは逆順 (右から左) になっています。したがって、ROMブロックまたはメモリの終わりまで続きます。これにより、プロセッサで例外が発生し、それ自体がソフト リセットされる可能性があります。