CPUの構成

スタックポインタとスタック領域

スタック領域は,データ(汎用レジスタやPSW,ELRなど)を一時的に保存するために使われる領域です。
例えば,サブルーチン処理や割り込み処理でレジスタを変更するときに,処理の最初でレジスタの内容をスタックに保存しておき,処理の最後でスタックの内容をレジスタに戻すことで,元の処理に影響を与えないようにすることができます。
スタックポインタはスタック領域のアドレスを指し示すレジスタで,主にPUSH命令やPOP命令により変更されます。
PUSH命令はデータをスタックに退避する命令で,POP命令はデータをスタックから復帰する命令です。そして,スタックポインタは,PUSH命令でデータをスタック領域に退避する前に下位アドレス方向に減算され、POP命令でデータをスタック領域から復帰した後に上位アドレス方向に加算されます。
ちなみに,スタック領域に対するデータの出し入れは,先入れ後出し(FILO:First In Last Out)方式で行われます。この方式により,サブルーチン呼び出しや割り込みがネストした場合でも,スタックへのデータの退避、復帰が簡単に行えるようになっています。

ここで,PUSH XR0という命令を実行するときのスタック領域とスタックポインタの変化の様子を以下に示します。
XR0はR3,R2,R1,R0を結合した4バイトのレジスタで、R3が最上位バイト、R0が最下位バイトになります。
XR0には,0x12345678(16進数)という値が格納されているとします。

次にPOP XR0という命令を実行するときのスタック領域とスタックポインタの変化の様子を以下に示します。先のPUSH命令とは逆の動作になります。

このように,スタック領域はデータを退避・復帰するのに利用できるので,サブルーチン呼び出しや割込みでよく使われます。
割込みについては,別途説明することにします。



マイコン設計者がお答えします!技術的問い合わせフォーム