运行时堆栈的C代码

时间:2013-12-12 02:38:25

标签: stack callstack lc3

我不知道我的问题标题是否正确,但我正在研究运行时堆栈,我有以下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

我希望有人可以在这个问题上给我一些清晰度。提前谢谢。

1 个答案:

答案 0 :(得分:0)

好的,这一切都取决于你正在使用的ABI。如果它类似于 SystemV x86 Abi (32位linux中的那个)。它应该看起来像你所描述的。 (我修改了我的答案以匹配wikipedia describes for LC-3

首先,您到达main(),并且有4个局部变量,每个变量都是int。 (假设每个int为4个字节,堆栈对齐为4个字节),它们将存储在:

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

然后你调用一个函数,即func()。 LC-3 abi表示参数必须在栈中传递,从rigth到左:

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在哪里通过它。也许它也可以在堆栈上返回。

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

你应该有一份文件,其中定义了所有这些东西。