一个堆栈图

一个堆栈图

六月 04, 2022

在这里插入图片描述
在这里插入图片描述
我们开始执行前两个指令
在这里插入图片描述
在这里插入图片描述

看见call指令:将0040100A的值给eip,并将下一个指令的地址压到栈里
在这里插入图片描述
我们用F7步入,我们进入40100A的语句时是在这里插入图片描述
这里没有改变堆栈的操作,我们F8跳过
之后来到了这里
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
让栈顶升16个4字节,也就是向上走16位
在这里插入图片描述
push ebx push esi push edi:用来保护现场
在这里插入图片描述
在这里插入图片描述
lea让edi取ebp-40后的地址,不影响堆栈
在这里插入图片描述
这三行命令:
mov ecx,10:让ecx存储10这个值,而ecx是计数寄存器
mov eax。CCCCCCC:让eax存储CCCCCCC的值
最重要的就是最后一个指令:rep就是根据计数寄存器的值进行重复操作
这里的stos是将eax的值存储到edi指定的内存单元中
这里重复16次
在这里插入图片描述
在这里插入图片描述
EBP+8就是1的位置,EBP+C就是2的位置,所以两次指令下来,EAX里面是3,这两个指令不改变堆栈
在这里插入图片描述
这三条指令就是为了回复现场,还原到开始的状态
在这里插入图片描述
让ESP、EBP的值相等
在这里插入图片描述
pop ebp:把栈顶的地址给ebp,且栈升4,上面call的返回地址就用到了这里。
在这里插入图片描述
retn相当于pop eip,直接把返回地址给eip了
在这里插入图片描述
最后的栈没有回复到先前的状态,在外面进行平衡栈,是外平栈
就是谁调用函数,谁平衡栈
在这里插入图片描述