分析Java堆栈并探索堆栈框架

电脑杂谈  发布时间:2020-04-05 09:13:45  来源:网络整理

栈帧_23.976帧和24帧的区别_25帧和30帧的区别

...

}

在main调用func函数之前,是栈,即main的栈框架:

栈帧_25帧和30帧的区别_23.976帧和24帧的区别

从低地址esp到高地址ebp的区域是当前主要功能的堆栈帧. 在main中调用func时,编译大致为:

推米

推n;将两个参数压入堆栈

呼叫func;调用func,在堆栈上填写返回地址,然后跳转到func

23.976帧和24帧的区别_25帧和30帧的区别_栈帧

当您跳到func时,请看一下func的编译:

__函数:

推动ebp;这非常重要,因为现在我们有了一个新函数,也就是说我们必须拥有自己的堆栈框架,然后我们必须保存上述函数main的堆栈框架的底部;保存,因为前一个堆栈框架的顶部将是func堆栈框架的底部. (两个堆栈帧相邻)

25帧和30帧的区别_栈帧_23.976帧和24帧的区别

mov ebp,esp;前一个堆栈框架的顶部是该堆栈框架的底部

;我们先来看一下当前的堆栈

;在这里,新的堆栈框架开始

23.976帧和24帧的区别_25帧和30帧的区别_栈帧

sub esp,8; int a,b在这里声明了两个int栈帧,因此esp减少了8个字节来为a,b分配空间

mov dword ptr [esp + 4],[ebp + 12]; a = m

mov dword ptr [esp],[ebp + 8]; b = n

通过这种方式,堆栈情况变为:

ret 8;返回,则8代表参数占用的字节数,当返回时栈帧,esp-8,释放参数m的空间n

可以看出,通过ebp可以轻松找到上述参数. 从func函数返回时,首先esp移到堆栈框架的底部(即释放局部变量),然后将上一个函数的堆栈框架的底部指针弹出到ebp,然后将返回地址弹出到cs: ip ,esp继续移动参数,以便esp,esp返回到调用该函数之前的状态,即现在已还原原始主堆栈帧.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-164568-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...