スタックとは

すたっく

最後に入れた要素を最初に取り出す、後入れ先出し(LIFO)のデータ構造。要素を積む操作を push、取り出す操作を pop という。関数呼び出しの戻り先や局所変数の管理(コールスタック)、逆ポーランド記法の式の計算、深さ優先探索などに使われる。

「スタック」は、8分野の34問の練習問題に出てきます(命令セット・アセンブリ, リンカ・ローダと実行形式, データ構造とアルゴリズムなど)。

この用語の分野: データ構造とアルゴリズム

スタックの練習問題に挑戦

ほかの関数を呼ばない関数(葉関数、リーフ関数)では、raをスタックに保存しなくてよい場合が多い。その理由として正しいものはどれか。

  1. A葉関数ではret命令を使わないから
  2. B葉関数の戻り先は、CPUが自動でスタックに積むから
  3. Cほかの関数を呼ばないので、raが上書きされず、戻り先がそのまま残るから
答えと解説を見る

正解:C. ほかの関数を呼ばないので、raが上書きされず、戻り先がそのまま残るから

raは関数を呼ぶjalのたびに上書きされるので、ほかの関数を呼ぶ関数は自分の戻り先を最初にスタックへ保存しなければなりません。葉関数はjalを使わないのでraが壊れず、保存なしでretできます。さらに呼び出し先保存のレジスタも使わなければ、スタックフレームを作る必要すらありません。x86のcall命令は戻り先を必ずスタックに積むので、ここはRISC-Vとの違いです。

RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。

  1. A内側の呼び出しでraが上書きされ、外側の関数が正しい呼び出し元へ戻れなくなる
  2. BCPUが自動でraを保存するので、何も問題は起きない
  3. C再帰の深さに関係なく、計算結果が2倍になる
答えと解説を見る

正解:A. 内側の呼び出しでraが上書きされ、外側の関数が正しい呼び出し元へ戻れなくなる

再帰呼び出しのjalは、raを「自分の中の呼び出しの次の命令」で上書きします。保存していないと、外側の関数がretしたとき元の呼び出し元ではなく自分の中へ戻ってしまい、同じ場所を繰り返したり誤動作したりします。そのため、ほかの関数を呼ぶ関数は、プロローグでraをスタックに保存し、エピローグで戻すのが決まりです。

解説の中の「スタック」

「スタック」が出てくる問題(34問)

  1. ほかの関数を呼ばない関数(葉関数、リーフ関数)では、raをスタックに保存しなくてよい場合が多い。その理由として正しいものはどれか。
  2. RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。
  3. プロセスのヒープとスタックを、間に広い空きをはさんで反対向きに伸ばす配置にする利点として正しいものはどれか。
  4. 再帰が深くなりすぎてスタックの上限を超えたとき、Linuxなどで一般に起こることとして正しいものはどれか。
  5. MMUを持たない小さなマイコンで、スタックの使いすぎについて注意すべきこととして正しいものはどれか。
  6. 空のスタックに対して、push 1、push 2、pop、push 3、push 4、pop、pop の順に操作した。pop で取り出された値を順に並べたものはどれか。
  7. 逆ポーランド記法(後置記法)で書かれた式「3 4 + 2 * 5 −」を、数が来たらスタックに積み、演算子が来たら2つの値を取り出して計算し、結果を積む方法で評価した。結果はいくらか。ここで、演算子の左側の値は先に積まれた方の値とする。
  8. 要素数5の整数型の配列 st と整数型の変数 top でスタックを表す。st の要素はすべて0、top は0から始める。push(v) は top に1を加えてから st[top] ← v を行い、pop() は st[top] の値を返してから top から1を引く(st の要素は変えない)。次のプログラムを実行した後の top と st の組はどれか。
  9. CPUのプログラムカウンタ(PC)が保持しているものはどれか。
  10. プログラムでサブルーチン(関数)を呼び出すとき、戻り先のアドレスなどを一時的に保存するために一般的に使われる領域はどれか。
  11. RISC-Vの命令「lw t0, 8(sp)」の動作として正しいものはどれか。
  12. 呼び出し規約(コーリングコンベンション)が決められている主な目的はどれか。
  13. RISC-Vの標準の呼び出し規約で、整数の引数と戻り値の受け渡しに使うレジスタとして正しいものはどれか。
  14. RISC-Vの標準の呼び出し規約で、整数の引数が10個ある関数を呼ぶとき、9個目と10個目の引数はどこで渡されるか。
  15. RISC-Vの呼び出し規約で、s0〜s11が「呼び出し先保存(callee-saved)」のレジスタとされている意味として正しいものはどれか。

データ構造とアルゴリズムの参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

この用語が出てくる比較

半導体・電子回路・情報の計算ツール

関連する用語

変数 再帰 リターンアドレス ヒープ 引数 配列 呼び出し規約 戻り値 スタックフレーム キュー

用語集の一覧へ