当前位置:主页 > 日博365怎么样 >

%Ebp堆栈帧,%esp详细信息

时间:2019-11-03 16:59   日博365怎么样  

首先要了解的是,电池从高地址扩展到低地址。
每个对每个函数的调用都有其自己单独的堆栈框架,其中包含各种必要的信息。
ebp寄存器指向当前堆栈帧的底部(高地址),而esp寄存器指向当前堆栈帧的顶部(地址地)。
下图显示了典型的存取器放置,并观察了将电池推入电池的位置。esp = esp-4,等效于eax-[esp];等效于popax;[esp]]如下图所示-eax,esp = esp + 4; C程序堆栈如下图所示可以确认以下更改:voidfunc(intm,intn){inta,b; a = m; b = n;}main(){。
Func(m,n); L:下一条语句。
}对于func函数的主调用之前的堆栈,即主堆栈帧:从低esp方向到高ebp地址的区域是主函数的堆栈帧。现时
在main中调用func时,程序集看起来大致如下:pushmpushn;两个参数插入到callfunc堆栈中。调用func,将返回地址写入堆栈,在func上调用到func的跳转,并显示func程序集。看起来像这样:__func:pushbp;这很重要。因为我们已经达到了一个新函数,也就是说,我们需要自己的堆栈框架,所以我们需要保存以前的主函数堆栈框架的底部。堆栈的顶部未保存,因为前一个堆栈框架的顶部变成了函数堆栈框架的底部。
(两个相邻的堆栈框)movebp,特别是;上一个堆栈框的顶部是堆栈框的底部。暂时检查当前电池状态。在这里,新的堆栈框从subsp 8开始。inta,b在这里声明了两个条目,因此esp将空间减少8个字节,并为a,b分配空间movdwordptr[esp + 4],[ebp + 12]; a = mmovdwordptr[esp],[ebp + 8]; b = n,堆栈状态如下所示:返回值,即8表示参数占用的字节数。返回时,如果释放esp-8,则参数m将通过ebp显示n个空格。查找上一个参数很容易。
从func函数返回后,esp首先移至堆栈框架的底部(即释放局部变量),在ebp之前显示函数堆栈框架的底部指针,然后显示cs:ip,由于esp的返回地址继续超出参数范围,因此ebp和esp返回到调用函数之前的状态。换句话说,恢复了原始的主堆栈框架。