0

質問のタイトルが正しいかどうかわかりませんが、ランタイム スタックを勉強していて、次の C コードがあります。

int main() {
  int a, b, c , x;
  a = 4;
  b = 5
  c = 6
  x = func(a, b, c);
  return;
}
int func(int x, int y, int z) {
  int p, q, r;
  p = x*x;
  q = y/z;
  r = p + q;
  return r;
}

これはコンパイルされ、場所 x3000 にロードされます。

私はlc3と呼ばれるシミュレートされたコンピューターを扱っています。このコードが実行されたときにランタイム スタックがどのように見えるかを調べる必要があります。このトピックに関する私の理解は、実際にこれを解決するにはあまりにも限られていますが、次のように考える必要があります。

x0000
      (I don't know how the return should look either)
      (Assignments that I don't know how to interpret)
      r
      q
      p
      main's frame pointer
      Return address to main
      Return value to main
      x a
      y b
      z c
      (I don't know the assignments should look in the run-time stack)
      x
      c
      b
      a
xEFFF

誰かがこの件について明確に説明してくれることを願っています。前もって感謝します。

4

1 に答える 1

0

これはすべて、使用している ABI によって異なります。それがSystemV x86 Abi (32 ビット Linux のもの) に似ている場合。あなたが説明したように見えるはずです。(ウィキペディアが LC-3 について説明しているものと一致するように回答を変更しました)

まず、 に到達main()し、4 つのローカル変数があり、それぞれが ですintint(それぞれが 4 バイトで、スタックが 4 バイトに整列されていると仮定すると)、それらは次の場所に格納されます。

0xEFFC: a
0xEFF8: b
0xEFF4: c
0xEFF0: x

次に、関数、つまり を呼び出しますfunc()。LC-3 abi は、パラメーターが右から左にスタック上で渡される必要があることを示しています。

0xEFEC: z --> c
0xEFE8: y --> b
0xEFE4: x --> a

次に、戻り値用のスペースを確保し、戻りアドレスを入力して、R5 を保存する必要があります。

0xEFE0: Return value
0xEFDC: Return address to main
0xEFD8: Space for R5

再びローカル変数:

0xEFD4: p
0xEFD0: q
0xEFCC: r

最新のシステムでは、戻り値をレジスター (EAX など) で渡すことができます。どこに渡すかは、ABI によって異なります。おそらく、スタックにも返される可能性があります。

もう 1 つのことは、各関数がスタック フレームを作成し、親のベース スタック アドレスをスタックにプッシュし、そのスタックがそのアドレスから始まると想定できることです。

おそらく、これらすべてが定義されているドキュメントが必要です。

于 2013-12-12T03:38:00.217 に答える