《反汇编基础》调用函数时栈的操作

来源:互联网 发布:mac怎么同时开两个窗口 编辑:程序博客网 时间:2024/06/07 09:34


-------------------------------------------以下转自boxer------------------------------------------00401060   push        ebp    ;保存ebp,          执行这句前ESP = 0012FF84,EBP = 0012FFC0

;push的结果是esp总减少,执行后ESP = 0012FF80,EBP = 0012FFC0
00401061   mov         ebp,esp    ;将esp放入ebp中此时ebp和esp相同,即执行后ESP = EBP = 0012FF80


;原EBP值已经被压栈(位于栈顶),而新的EBP又恰恰指向栈顶。
;此时EBP寄存器就已经处于一个非常重要的地位,该寄存器中存储着栈中的一个地址(原EBP入栈后的栈顶),
;从该地址为基准,向上(栈底方向)能获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值,
;而该地址处又存储着上一层函数调用时的EBP值!

------------------------------------------------------------------------------

00401063   sub         esp,40h    ;把esp往上移动一个范围
                                               ;等于在栈中空出一片空间来存局部变量
                                               ;执行这句后ESP = 0012FF40
00401066   push        ebx    ;下面3句都是保存3个寄存器
00401067   push        esi
00401068   push        edi
00401069   lea         edi,[ebp-40h]  ;把ebp-40h加载到edi中,目的是保存局部变量的区域
0040106C   mov         ecx,10h
00401071   mov         eax,0CCCCCCCCh  ;从ebp-40h开始的区域初始化成全部0CCCCCCCCh,就是int3断点

00401076   rep stos    dword ptr [edi]  ;拷贝字符串,初始化局部变量空间


源博文地址:点这里

0 0