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 个局部变量,每个变量都是int. (假设每个int是 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 将其传递到何处。可能它也可以在堆栈上返回。

另一件事是每个函数都可以创建一个堆栈帧,将父级的基本堆栈地址推入堆栈,并假设它们的堆栈从该地址开始。

您可能应该有一个文档,其中定义了所有这些内容。

于 2013-12-12T03:38:00.217 回答