所以,我对为汇编代码绘制堆栈帧感到困惑。 我有一种感觉,我开始错了。
这是我到目前为止所得到的,但是你可以看到我在第5步感到困惑,因为我认为我的初始布局是错误的。
你能告诉我哪里出错了吗?
答案 0 :(得分:25)
我想我会从一个图表开始,它在堆栈的“顶部”显示一些(半)任意数量的空白空间,并且可能会向左显示EBP和ESP,并用箭头显示它们的位置指着。我已经使用实线箭头表示“指向”并虚拟数据移动(回想起来,反转它可能会更好)。
答案 1 :(得分:2)
当前ebp(从esp捕获)到 y 之间的距离在这种情况下确实是8个字节,因为你有返回eip和堆栈上前一个ebp的值。你的图表是正确的,虽然左手地址更令人困惑:)
答案 2 :(得分:1)
该图显示了返回地址下面的参数,这实际上是错误的。
假设堆栈向低地址增长,如果需要在堆栈上放置参数,则与返回地址相比,它们驻留在更高的地址。
答案 3 :(得分:0)
你的图表是正确的。编译器使用了一些优化技巧:第一个调用是“非常正常”,实际上“f”参数放在堆栈顶部。在本地上下文清理(指令“离开”)之后推迟第二次调用,并且“h”函数的参数ir“再循环”以包含“2”。比第二次“调用”到“f”变成一个简单的“jmp”,因为它是调用函数“h”的最后一行(“h”的上下文已经被“离开”抛弃了)。
再见!