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

来源:学生作业帮助网 编辑:作业帮 时间:2024/07/13 23:59:27
程序为什么开头总是PUSH EBP?他是做什么用的?为什么很多程序跳过句指令(在入口点+1)依然可以正常运行?
xSn@;ª(@XFPmUECI<HF(/j;fYq/`ιs8"GAL&:Wa@7S,V_vc:#$TN3T5{;sh}VQwPA@ZIͷw<] hj٨ [)9x+=aQ+ * RtYQsR6%Pga:z&sdYGe_t 91`z^ٍKpV򉫔[L%f5L.mtEX^AQP\u(J@b'I"1a׋QE$HP4kȗ$O5:^u˓=-bvANbhq⮋,IJǒ |Bк} mE\.n@iWo9y4K,agj *Ss<]f1% ;K~^ky( ֵ|eZWܫ$FJ$yt {ml.Od|'99JȄu<mpEșƗFM4-i{OO.s&~p/X~8JO/

程序为什么开头总是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.