子函数嵌套调用,子函数栈内是顺序,并不是嵌套。而是多个子程序块对应多个栈帧,依次向栈移动方向排开,下一个栈帧的栈底是上一个栈帧的栈顶,每个栈帧预留C0(196)字节,不是栈帧内嵌套包含栈帧,图解

函数调用堆栈图

独木_DZ 2015-08-18 15:38:49  4721  收藏 5
分类专栏: 汇编 文章标签: 画堆栈图 栈 汇编语言 函数 vs2012
版权
熟悉函数调用时的堆栈操作是学好汇编语言的必备知识,在此只写出了最简单的函数调用过程 , 有错误的地方,欢迎批评指正.

注:该程序通过VS2012编译. 函数调用方式为C调用方式 : A. 用栈自右向左传参   B : 调用者平衡堆栈
由于使用xls画的堆栈图,只能以贴图方式进行.
1. C语言的源码

#include "stdafx.h"     
                
int Plus(int x,int y)     
{               
     int z = 2;     
                
     return x+y+z;     
}               
int _tmain(int argc, _TCHAR* argv[])
{               
     int r = Plus(3,4);
     return 0;     
}               

2.调用Plus函数的汇编语言

2.1
                 


2.2  压入参数
               
       两个Push指令,ESP-8.

2.3  调用函数
                
 
2.4.保存原来EBP
                            

        注: call指令两个要点  A : 将下一条指令地址 (返回地址)入栈 , ESP - 4

                                              B : 将call指令后的地址存至 EIP 寄存器

2.5 将当前栈顶作为栈底
                                 

2.6 开辟栈空间
                 

               4,5,6 这三条指令合称为打开栈帧. 

               注 : sub  esp , 0xC0 其中的0xC0为编译器为该函数分配的缓冲区大小,其大小可由编译器设置
               

2.7 保存现场
                           

2.8  Debug版 编译器向缓冲区填充 int 3(即 0xCC)指令
.                             

 

 

              注:后四条指令才真正为函数的核心功能

     EBP本身的地址编号存放的是 上一个函数的EBP的值

                    EBP - XX 为局部变量,  EBP + 4为返回地址 , EBP + 8及以后为参数
2.9  恢复现场
                    


2.10 恢复栈帧
                             


2.11调用函数结束 返回RET
                         
                                             RET
                   注: 该处采用的是C调用方式, 调用者平衡堆栈 

                         RET指令 将返回地址弹出栈  ESP+4


2.12 平衡堆栈
                                      
                     
   可以对比第一幅图的栈顶栈帧,是相同的。另外,ESP , EBP的值随机 。
            在此只列出了调用一个函数的堆栈使用情况,各位看官可以自行拓展    

————————————————
版权声明:本文为CSDN博主「独木_DZ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jxz_dz/article/details/47749603

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值