我制作的这个栈帧对吗?
对于我正在做的一份试卷,我有一个关于堆栈框架的问题:
考虑讲座中使用的 Nada(一种虚构语言)中的以下函数:
function f(x,y)
begin
var z
z := y - x;
return z * z;
end;
这样的函数可能会这样调用:
n := f(a+2,b*3)
使用图表来说明你的回答,解释执行上面的函数调用时的事件顺序,显示堆栈帧如何在函数入口处构建并在函数退出时销毁,以及在访问参数 x 和 y 时如何使用基指针寄存器局部变量 z。
我已经回答了这个问题,这是我生成的堆栈框架:
我只是希望有人纠正这个问题如果其中部分错误,请告诉我...或者生成一个新的堆栈框架(如果有人有时间)。我将非常感谢您的帮助。
For a question paper i'm doing I got a question on stack frames:
Consider the following function in Nada (a made up language), the language used in the lectures:
function f(x,y)
begin
var z
z := y - x;
return z * z;
end;
Such a function might be called like this:
n := f(a+2,b*3)
Using diagrams to illustrate your answer, explain the sequence of events when the function call above is executed, showing how the stack frame is built on entry to the function and destroyed on exit from it, and how the base pointer register is used when accessing the parameters x and y and the local variable z.
I've answered this question and this is the stack frame I produced:
I just want someone to correct this for me if parts of it are wrong...or produce a new stack frame (if anyone's got the time). I'll really appreciate the help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这取决于调用约定。
但是,如果您假设它使用 _cdecl 调用约定,因为您提到了基指针:
https://i。 sstatic.net/5vQVB.jpg
其他调用约定可以使用寄存器等。优化可以进一步改变这一点,因为编译器将内联代码,确实调用各种东西来重新排列 CPU 流水线的代码等。
It depends on the calling conventions.
But if you assume that it is using _cdecl calling convention, since you mention a base pointer:
https://i.sstatic.net/5vQVB.jpg
Other calling conventions can use registers, etc. Optimizations can further change this, as the compiler will inline code, do call kinds of things with to rearrange the code for CPU pipelining, etc.