Renesas Synergy™

FAQ 1008802 : スタック(Stack)

レジスタの内容を上書きで消失させたくない場合に、一時的に退避させる領域がスタックで、メモリ(RAM)上に割り当てます。
なお、V850シリーズでは、ハード的なスタック領域の概念がなく、内部のレジスタが退避領域として割り当てられています。

CPUのサブルーチン・コールのように、プログラム処理が別アドレスへ分岐する際、元のアドレスへ戻ることを前提にする場合があり、その戻り先のアドレス(プログラム・カウンタ(PC)の値)をスタックに退避させます。この分岐をするのは、割り込みとサブルーチン・コール(CALL命令)のときで、割り込みではPSW(Program Status Word:プログラム実行情報のフラグ・レジスタ)の内容も退避させます。
各処理の最後に次のような復帰命令を実行すると、スタックに退避させたアドレスがPCに復帰して、自動的に元の処理へ戻ります。
割り込み:RETI (Return from Interrupt)命令(PSWも復帰)
サブルーチン・コール(CALL命令):RET (Return)命令
なお、ジャンプ命令やブランチ命令での分岐は、戻ることを前提としていないので、このようなスタック操作を行いません。

また、演算等でレジスタを使用する際、現状のレジスタ値をあとで使用する場合に、PUSH命令でレジスタ値をスタックに退避させます。
PUSH命令に対しては、スタックに退避させたレジスタ値が必要となったときにPOP命令を実行して、元のレジスタに復帰させます。

CPUにはスタック・ポインタ(SP)があり、スタック領域のどこをアクセスするかを管理しています。スタック・ポインタの値をデクリメント(-1)したアドレスにデータがストアされるため、スタック・ポインタの初期値は通常、RAMの「最高アドレス+1」に設定されます。
スタックには、汎用レジスタより多くのデータを格納できますが、読み出しには条件があります。この条件はLIFO(Last-in First-out)と呼ばれる制御で、最後に書き込んだデータが最初に読み出されます。つまり、最初に書き込んだデータの読み出しは最後になります。

他にご質問がございましたら、リクエストを送信してください