私はこれにまったく慣れていないので、いくつか質問があります。理解していただけると幸いです。
プロシージャが呼び出されたときに最初に行う必要があるのは、前の FP を保存することです (プロシージャの終了時に復元できるようにするため)。次に、SP を FP にコピーして新しい FP を作成し、SP を進めてローカル変数用のスペースを確保します。このコードは、プロシージャ プロローグと呼ばれます。プロシージャの終了時に、プロシージャ エピローグと呼ばれるスタックを再度クリーンアップする必要があります。Intel ENTER および LEAVE 命令と Motorola LINK および UNLINK 命令は、ほとんどのプロシージャ プロローグおよびエピローグ作業を効率的に行うために提供されています。
上記のテキストは、スタック紙を粉砕することから引用されたものであり、次の質問を理解するのが非常に難しいことがわかりました。
「プロシージャが呼び出されたときに最初に行う必要があるのは、前の FP を保存することです (したがって、プロシージャの終了時に復元できます)。次に、SP を FP にコピーして、新しい FP を作成します」
1) SP を FP にコピーすると、保存されているはずの FP 値が消去されますか?
「次に、SP を FP にコピーして新しい FP を作成し、SP を進めてローカル変数用のスペースを予約します。」
2) なぜ SP を進める必要があるのですか? ローカル変数がプッシュされたときに自動的にデクリメントされるはずではありませんか?
3) サブルーチンを呼び出さずにメイン関数を開始するときの SP、IP、および FP の両方の値は?