Compiler construction 我制作的这个堆叠框架对吗?

Compiler construction 我制作的这个堆叠框架对吗?,compiler-construction,stack,frame,Compiler Construction,Stack,Frame,对于我正在做的一篇问题论文,我有一个关于堆栈框架的问题: 考虑Nada(一种合成语言)中的以下功能,Nada是讲座中使用的语言: function f(x,y) begin var z z := y - x; return z * z; end; 这样的函数可以这样调用: n := f(a+2,b*3) 使用图表来说明您的答案,解释执行上述函数调用时的事件顺序,显示堆栈帧是如何在函数进入时构建并在退出时销毁的,以及在访问参数x和y以及局部变量z时如何使用基指针寄存器 我已经回答了这个问题,这

对于我正在做的一篇问题论文,我有一个关于堆栈框架的问题:

考虑Nada(一种合成语言)中的以下功能,Nada是讲座中使用的语言:

function f(x,y)
begin
var z
z := y - x;
return z * z;
end;
这样的函数可以这样调用:

n := f(a+2,b*3)
使用图表来说明您的答案,解释执行上述函数调用时的事件顺序,显示堆栈帧是如何在函数进入时构建并在退出时销毁的,以及在访问参数x和y以及局部变量z时如何使用基指针寄存器

我已经回答了这个问题,这是我制作的堆栈框架:


我只是想有人帮我纠正这一点,如果它的一部分是错误的…或产生一个新的堆栈帧(如果有人有时间)。我非常感谢您的帮助。

这取决于通话习惯

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


其他调用约定可以使用寄存器等。优化可以进一步改变这一点,因为编译器将内联代码,使用调用来重新排列CPU管道的代码,等等。

@Heandel,我不完全确定我认为两者都是。Nada是我必须在课程中使用的一种虚构的编程语言。如果不了解更多关于“Nada”及其实现的知识,我不确定能否回答这个问题。我的第一个头部倾斜力矩是在新旧堆栈帧中都有
a+2
b*3
Z
的位置。我不知道这是为什么。而
b*3
是否有意与
b+3
不同?这是我自己的偏见,但如果没有其他信息,我倾向于将Nada视为这方面的典型C实现,在这种情况下,我不认为您的实现是正确的,尽管我也无法证明它没有调用函数
f
的代码。@是的,哦,对不起,b+3应该是b*3。同样,你可以把Nada当作C.f只是调用函数f。就像你把x和y变量存储在里面一样。