程序为什么开头总是PUSH EBP?他是做什么用的?为什么很多程序跳过句指令(在入口点+1)依然可以正常运行?

来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/22 20:46:35
程序为什么开头总是PUSHEBP?他是做什么用的?为什么很多程序跳过句指令(在入口点+1)依然可以正常运行?程序为什么开头总是PUSHEBP?他是做什么用的?为什么很多程序跳过句指令(在入口点+1)依

程序为什么开头总是PUSH EBP?他是做什么用的?为什么很多程序跳过句指令(在入口点+1)依然可以正常运行?
程序为什么开头总是PUSH EBP?
他是做什么用的?
为什么很多程序跳过句指令(在入口点+1)依然可以正常运行?

程序为什么开头总是PUSH EBP?他是做什么用的?为什么很多程序跳过句指令(在入口点+1)依然可以正常运行?
子程序如何存取参数,因为缺省对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 EBP 来存取堆栈,假定在一个调用中有两个参数,而且在 push 第一个参数前的堆栈指针 ESP 为 X,那么压入两个参数后的 ESP 为 X-8,程序开始执行 call 指令,call 指令把返回地址压入堆栈,这时候 ESP 为 X-C,这时已经在子程序中了,我们可以开始使用 EBP 来存取参数了,但为了在返回时恢复 EBP 的值,我们还是再需要一句 push ebp 来先保存 EBP 的值,这时 ESP 为 X-10,再执行一句 mov ebp,esp,根据右图可以看出,实际上这时候 [ebp + 8] 就是参数1,[ebp + c]就是参数2.