【发布时间】:2011-09-10 12:41:53
【问题描述】:
对于我正在做的一份试卷,我有一个关于堆栈框架的问题:
考虑在讲座中使用的语言 Nada(一种虚构的语言)中的以下功能:
function f(x,y)
begin
var z
z := y - x;
return z * z;
end;
这样的函数可能会这样调用:
n := f(a+2,b*3)
用图表来说明你的答案,解释上面的函数调用执行时的事件顺序,显示堆栈帧是如何在进入函数时建立并在退出函数时销毁的,以及如何使用基指针寄存器访问参数 x 和 y 以及局部变量 z 时。
我已经回答了这个问题,这是我制作的堆栈帧:
如果部分错误,我只想有人为我纠正这个问题......或者生成一个新的堆栈帧(如果有人有时间的话)。非常感谢您的帮助。
【问题讨论】:
-
@Heandel,我不完全确定我认为两者兼而有之。 Nada 是一种编造的编程语言,我必须在我的课程中使用。
-
如果不了解更多关于“Nada”及其实现的信息,我不确定是否可以回答这个问题。我的第一个头倾斜时刻是在新旧堆栈框架中都有
a+2、b*3和Z。我不确定为什么会这样。b*3是否故意与b+3不同?这是我自己的偏见,但在没有其他信息的情况下,我倾向于在这方面将 Nada 视为典型的 C 实现,在这种情况下,我认为你所拥有的不是正确的,尽管我也无法证明它没有f被调用的函数的代码 from. -
@是的,抱歉,b+3 应该是 b*3。另外,是的,您可以像对待 C 一样对待 Nada。f 只是调用函数 f。就像您将 x 和 y 变量存储到其中一样。
标签: compiler-construction stack frame