C++函数调用栈空间结构探究&《程序员的自我修养》纠错

本文基于VS2008的debug环境,探讨了C++函数调用时内存的栈空间结构,通过反汇编和单步调试,发现《程序员的自我修养》书中关于栈结构的描述存在小错误。作者详细解释了EBP和ESP指针在函数调用过程中的变化,并展示了函数调用时栈的布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

杨力祥老师在C++课后给同学留了一道思考题,即探讨C++函数调用时其内存的结构究竟是什么样的。在参考《程序员的自我修养》的过程中,对于书上的描述有些疑惑,因此自己在VS2008的环境下,对程序1进行了反汇编,并随着单步调试的进行察看了内存的变化,发现书上给出的图和描述存在一些小错误。在此将实际的过程记录下来。

 

//程序1

#include <iostream>

using namespacestd;

int foo(inti){

    int a= 1, b= 2;

    b = a;

    return i;

}

int main(){

    int a =foo(0xABCDEF);

    return 0;

}

首先要说明的是,程序运行时的实现是根据编译器的不同而不同的,因此需要强调,本文中讨论的所有过程都是在VS2008的编译环境下进行的,且考察的是debug版本的反汇编。

图1 运行时的栈结构

图1 是函数调用时栈的结构,下面来具体说一说汇编指令每一步都做了什么。

要事先说明的是EBP指针和ESP指针,前者在一个函数的运行过程中(没有调用其他函数时)是一个固定值,它指向的位置如图1所示;后者是栈顶指针。

操作方

对应汇编

内存操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值