【问题标题】:Is this stack frame I produced right?我制作的这个堆栈帧对吗?
【发布时间】: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+2b*3Z。我不确定为什么会这样。 b*3 是否故意与 b+3 不同?这是我自己的偏见,但在没有其他信息的情况下,我倾向于在这方面将 Nada 视为典型的 C 实现,在这种情况下,我认为你所拥有的不是正确的,尽管我也无法证明它没有 f 被调用的函数的代码 from.
  • @是的,抱歉,b+3 应该是 b*3。另外,是的,您可以像对待 C 一样对待 Nada。f 只是调用函数 f。就像您将 x 和 y 变量存储到其中一样。

标签: compiler-construction stack frame


【解决方案1】:

这取决于调用约定。

但是如果你假设它使用 _cdecl 调用约定,因为你提到了一个基指针:

http://i.stack.imgur.com/5vQVB.jpg

其他调用约定可以使用寄存器等。优化可以进一步改变这一点,因为编译器将内联代码,调用各种东西以重新排列 CPU 流水线的代码等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 2019-09-19
    • 2016-05-04
    • 2021-11-03
    • 2021-01-08
    • 2016-01-12
    • 2016-12-27
    • 2014-11-28
    相关资源
    最近更新 更多