为x86组装绘制堆栈框架

时间:2010-03-17 21:50:31

标签: assembly x86

所以,我对为汇编代码绘制堆栈帧感到困惑。 我有一种感觉,我开始错了。

这是我到目前为止所得到的,但是你可以看到我在第5步感到困惑,因为我认为我的初始布局是错误的。

enter image description here enter image description here

你能告诉我哪里出错了吗?

4 个答案:

答案 0 :(得分:25)

我想我会从一个图表开始,它在堆栈的“顶部”显示一些(半)任意数量的空白空间,并且可能会向左显示EBP和ESP,并用箭头显示它们的位置指着。我已经使用实线箭头表示“指向”并虚拟数据移动(回想起来,反转它可能会更好)。

alt text

答案 1 :(得分:2)

当前ebp(从esp捕获)到 y 之间的距离在这种情况下确实是8个字节,因为你有返回eip和堆栈上前一个ebp的值。你的图表是正确的,虽然左手地址更令人困惑:)

答案 2 :(得分:1)

该图显示了返回地址下面的参数,这实际上是错误的。

假设堆栈向低地址增长,如果需要在堆栈上放置参数,则与返回地址相比,它们驻留在更高的地址。

答案 3 :(得分:0)

你的图表是正确的。编译器使用了一些优化技巧:第一个调用是“非常正常”,实际上“f”参数放在堆栈顶部。在本地上下文清理(指令“离开”)之后推迟第二次调用,并且“h”函数的参数ir“再循环”以包含“2”。比第二次“调用”到“f”变成一个简单的“jmp”,因为它是调用函数“h”的最后一行(“h”的上下文已经被“离开”抛弃了)。

再见!