C语言探索之栈帧

本文详细探讨了C语言中栈帧的概念,包括内存区域、数据结构、汇编命令和CPU寄存器的作用。通过实例分析了栈帧的创建、使用和销毁过程,以及如何利用栈帧结构改变函数调用路径。
摘要由CSDN通过智能技术生成

.首先认识由c/c++编译的程序占用的内存有哪些部分:    

                                  

     1.其中堆区与栈区是相对而生的。(之后研究栈帧会将栈区单独列出来)

     2.在程序运行期间,地址空间区是一直存在的,程序退出,地址空间也随即释放。

二.其次需要认识一个数据结构以及两个汇编命令。

     1.认识一个数据结构:栈。

     栈有栈底和栈顶,是一种“先进后出”的结构。

      2. 两个汇编命令:pushpop

         从栈顶入栈称为push

         从栈底出栈称为pop

         其中入栈和出栈都是在同一位置进行的。

三.接下来了解CPU中需要用到的一些寄存器。

      CPU中:读取指令(内存-->CPU-->分析指令(CPU-->执行指令(CPU

      1. 通用寄存器:EAX EBX ECX EDX

      2. EIPpc):程序计数器(用来存放当前正在执行指令的下一条指令的地址)

      3. ESP:栈顶

      4. EBP:栈底

四.现在开始研究栈帧。

1. 研究栈帧,接下来会将其从地址空间里面单独列出。

2. VC6.0下通过此代码研究栈帧:

#include <stdio.h>

#include <windows.h>

int myadd(int a,int b)

{

int c = a+b;

return c;

}

int main()

{

int a = 0xAAAAAAAA;

int b = 0xBBBBBBBB;

int ret = myadd(a,b);

printf("%d\n",ret);

system("pause");

return 0;

}

3. 现在要做的是:Fn+F11进行调试,然后将其转换成汇编语言,打开寄存器和内存。

  main()函数

(1)进入main(),首先会根据该函数内部临时变量的大小为它开辟空间(也就是    main的栈帧)

                                        

(2) 开始对main()进行一系列操作

        

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值