函数调用栈帧,函数调用栈帧过程(带图详解)
Yyds干货库存
@TOC
一、esp和ebp寄存器描述
epesp存储地址的两个寄存器。
使用地址维护功能堆栈框架
第二,对于创造和毁灭的整个过程
1.为_mainCRTstarup创建函数
注意事项:
Push:将一个元素放在栈顶。
删除栈顶的一个元素。
堆栈空间的地址是先用高位地址,再用低位地址。
Push操作将ebp推入堆栈。
同时esp指出ebp up的地址变小,所以esp的地址变小。
Lea代表加载有效地址到加载有效地址。
将ebp-0E4h放入edi
Dowrd相当于4个字节。
从edi位置开始的ecx(存储39h次)的所有dword数据都更改为0xCCCCCCCCh,直到ebp结束。
(1).为什么有时会打印出烫伤?
0Ah代表10
将0Ah放入ebp-8的数据中
因为都是地址,ebp-8就是ebp地址减去8个字节。
如果a没有赋值,它将被放入0 xccccccch。
所以有时候打印结果是热,热,热,热。
14h以十六进制打印表示20,即ebp-20。
Ebp-20h代表ebp-32
1.
Ebp-20是B的值,即20
将ebp-14h(ebp-20)引入eax
将eax推送到堆栈eax
而esp指向eax。
2.
将ebp-8转移到ecx中
同时,ecx是堆叠的。
此时,ebp-8存储的值为10。
Esp指向ecx
3.
调用函数
堆栈下一条指令的地址。
同时,esp指向要调用的下一条指令的地址。
3.添加功能的创建
1.
将ebp堆栈esp指向ebp。这是ebp的主要功能。将esp分配给ebp,ebp和esp都指向ebp。
2.
Sub:从esp中减去0CCh
因为地址小。
推送堆栈ebx esi edi
3.
ecx(33h十六进制)次的所有dword数据都从edi位置转换为0CCCCCCCCh。
4.
将0放在ebp-8的位置。
(2).为什么参数不在函数中?
(3).返回值是如何放回函数中的?
1.
此时esp地址变大,下移。
2.
将mov ebp分配给esp
(ebp寄存器的指针。EBP-梅因从堆栈中释放
(5)参数A和B如何返回操作系统?
Ret是要返回调用的下一条指令的地址。
这里随着add函数的破坏,esp也从下一条指令的地址位置弹出到下一个位置。
esp最初指向的地址加8,即当前位置。
会将参数a b返回给操作系统。
将eax移动到ebp-32(20h是十六进制)
也就是说,函数Z的值被传递到主函数c中。
4.整个过程的图表
。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。