Assembly 为x86程序集绘制堆栈框架

Assembly 为x86程序集绘制堆栈框架,assembly,x86,Assembly,X86,因此,我对为我的汇编代码绘制堆栈框架感到困惑。 我有一种感觉,我一开始就错了 这是我到目前为止得到的结果,但正如你们所看到的,我在第5步感到困惑,因为我认为我最初的布局是错误的 你能告诉我哪里出错了吗?当前ebp(一旦从esp捕获)和y之间的距离在这种情况下实际上是8字节,因为堆栈上有返回的eip和上一个ebp的值。从我所能看出,您的图表是正确的,尽管左边的地址更令人困惑:)您的图表是正确的。编译器使用了一些优化技巧:第一次调用“非常正常”,实际上“f”参数被放置在堆栈顶部。第二次调用在本地

因此,我对为我的汇编代码绘制堆栈框架感到困惑。 我有一种感觉,我一开始就错了

这是我到目前为止得到的结果,但正如你们所看到的,我在第5步感到困惑,因为我认为我最初的布局是错误的


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

当前ebp(一旦从esp捕获)和y之间的距离在这种情况下实际上是8字节,因为堆栈上有返回的eip和上一个ebp的值。从我所能看出,您的图表是正确的,尽管左边的地址更令人困惑:)

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


再见

我想我应该从一个图表开始,该图表在堆栈的“顶部”显示了一些(半)任意数量的空白,可能会在左侧显示EBP和ESP,并用箭头显示它们指向的位置。我用实心箭头表示“指向”,用虚线表示数据移动(回想起来,倒过来可能更好)


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


假设堆栈朝着较低的地址增长,如果需要在堆栈上放置参数,则与返回地址相比,它们位于较高的地址。

Wow,这是一个很酷的图。你用什么程序画的?明天我会再看一遍——今晚我的脑子都快炸了。我假设这些图是从左到右从上到下的方向。然后我不确定在第三张图中,EBP和ESP最初是如何指向同一个地址的。我的意思是,在前面的图表中,它们是不同的。是的,这是
mov%esp,%ebp
。当你将ESP中的值移动到EBP中时,它们最终指向同一个位置…@Jerry:你介意我在即将到来的会议演讲中使用这个图表吗?当然,我会把它归因于你。@JerryCoffin,我对第二个图表有点怀疑。当调用push%ebp时,第一个ESP被递减4,然后ESP的内容被放置在ESP指向的位置,从而在旧的ebp和Y(参数)之间产生了间隙。