我不知道我的问题标题是否正确,但我正在研究运行时堆栈,我有以下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
我希望有人可以在这个问题上给我一些清晰度。提前谢谢。
答案 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在哪里通过它。也许它也可以在堆栈上返回。
另一件事是每个函数都可以创建一个堆栈帧,将父进程的堆栈地址推入堆栈,并假设它们的堆栈从该地址开始。
你应该有一份文件,其中定义了所有这些东西。