2011-06-08 45 views
8

对于试卷我做我得到了堆栈帧的一个问题:我制作的这个堆栈框架是否正确?

考虑纳达以下功能(由语言),在演讲中使用的语言:

function f(x,y) 
begin 
var z 
z := y - x; 
return z * z; 
end; 

这样的一个函数可以被称为是这样的:

n := f(a+2,b*3) 

使用图表来说明你的答案,当上面的函数调用执行,显示了堆栈帧是如何构建在进入功能和销毁解释事件的顺序退出,以及在访问参数x和y以及局部变量z时如何使用基址指针寄存器。

我已经回答了这个问题,这是堆栈帧我公司生产的:

sackframe I produced

我只是希望有人来纠正这对我来说,如果它的部分是错误的...或者产生一个新的堆栈帧(如果有人有时间)。我真的很感谢你的帮助。

+0

这是假设你的“Nada”语言完全是基于堆栈的还是基于寄存器的? – 2011-06-08 01:37:30

+0

@Hanandel,我不完全确定我认为它们都是。 Nada是一种编程语言,我必须在我的课程中使用它。 – 2011-06-08 01:55:16

+0

我不确定在不知道更多关于“Nada”及其实现的情况下,可以回答这个问题。我的第一个头部倾斜时刻是在新旧堆栈帧中都有'a + 2','b * 3'和'Z'的地方。我不确定这是为什么。并且'b * 3'有意不同于'b + 3'吗?这是我自己的偏见,但是如果没有其他信息,我会倾向于将Nada视为典型的C实现,在这种情况下,我不认为你有什么是对的,尽管我也无法证明它没有'f'被称为_from_的函数的代码。 – 2011-06-08 01:59:06

回答

1

这取决于调用约定。

但是,如果你认为它是使用_cdecl调用约定,因为你提到的基类指针:

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

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