函数压栈,栈帧ebp,esp怎样移动

来源:互联网 发布:2010网络歌曲排行榜 编辑:程序博客网 时间:2024/05/19 17:03


    函数被调用时: 

    1) EIP/EBP成为新函数栈的边界 
         函数被调用时,返回时的EIP首先被压入堆栈;创建栈框架时,上级函数栈的EBP被压入堆栈,与EIP一道行成新函数栈框架的边界 
    2) EBP成为栈框架指针SFP,用来指示新函数栈的边界 
        栈框架建立后,EBP指向的栈的内容就是上一级函数栈的EBP,可以想象,通过EBP就可以把层层调用函数的栈都回朔遍历一遍,调试           器就是利用这个特性实现 backtrace功能的 
    3) ESP总是作为栈指针指向栈顶,用来分配栈空间 
       栈分配空间给函数局部变量时的语句通常就是给ESP减去一个常数值,例如,分配一个整型数据就是 ESP-4 
    4) 函数的参数传递和局部变量访问可以通过SFP即EBP来实现  
         由于栈框架指针永远指向当前函数的栈基地址,参数和局部变量访问通常为如下形式: 
        +8+xx(%ebp)         ; 函数入口参数的的访问 
        -xx(%ebp)           ; 函数局部变量访问 


进入main函数的时候,
1)保存ebp指针
2)使得ebp->esp
3)保持现场ebx,esi,edi
4)进入一般函数的时候,push参数,例如有n个参数 esp = esp - 4*n
5)push函数返回地址 esp = esp -4
6)调用函数 EIP指向函数地址,jmp 函数地址
7)Push ebp 保存 (故有[ebp+8]就是第一个参数的内容)
8)使得ebp ->esp, esp = esp - 40h - 临时变量需要字节数(有字节对齐问题)
9)保持现场ebx,esi,edi
10)返回值=》eax
11)恢复现场,就是依次pop出edi,esi,ebx,
12)Esp = ebp
13)Pop ebp
14)pop 函数返回地址(即ret),EIP指向下个指令地址 esp = esp +4
15)Esp + n*4 (每个字有4个字节);push是按字操作的,32位机器

      

       
    假如函数A调用函数B,函数B调用函数C ,则函数栈框架及调用关系如下图所示: 

下图有点乱,因此删去部分内容,要看原图可参考我的blog
+----------------------------+---->; 高地址 
| EIP (上级函数返回地址)  |     
+----------------------------+   
| EBP (上级函数的EBP)     |  
+----------------------------+ 
| Local Variables            |    
| ..........                          |  
+-----------------------------+   
| Arg n(函数B的第n个参数) |   
+-----------------------------+ 
| Arg .(函数B的第.个参数)   |  
+-----------------------------+  
| Arg 1(函数B的第1个参数) |  
+-----------------------------+   
| Arg 0(函数B的第0个参数) |  
+-----------------------------+  
 EIP (A函数的返回地址)      | 
+-----------------------------+  
| EBP (A函数的EBP)          | 
+-----------------------------+   
| Local Variables             |   
| ..........                           |    
+-----------------------------+  
| Arg n(函数C的第n个参数) |   
+-----------------------------+    
| Arg .(函数C的第.个参数)   |   
+-----------------------------+   
| Arg 1(函数C的第1个参数) |  
+-----------------------------+   
| Arg 0(函数C的第0个参数) |   
+-----------------------------+    
| EIP (B函数的返回地址)     |  
+-----------------------------+  
| EBP (B函数的EBP)          |  
+-----------------------------+ 
| Local Variables             | 
| ..........                           |  
+-----------------------------+--->; 低地址 

   图 1-1  

原创粉丝点击