1 个函数栈帧创建的往事今生

本文通过一个加法函数的实例,探讨C语言中局部变量创建、函数传参、形参与实参的关系、函数调用及返回的底层原理。涉及栈帧管理、内存知识和汇编指令,如寄存器ESP、EBP、EAX的作用,以及MOV、SUB、PUSH、POP和CALL指令的使用。通过对main函数调用和返回过程的反汇编分析,揭示C语言运行的细节。

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

引文

在日常学习c语言的过程中,你可能有许许多多的疑问:

  • 局部变量是怎么创建的
  • 为什么局部变量的值不做初始化就是随机值
  • 函数是怎么传参的?传参的顺序是怎么样的?
  • 形参和实参是什么关系?
  • 函数调用是怎么做的?
  • 函数调用结束后是怎样返回的?

要想了解其中的原因,我们就不可避免去研究c语言中更深层次的原理--汇编

为了清晰的入手深层原理,我们用加法函数做一个实验

目录:

1.栈帧的管理工具——寄存器

2.数据存储——内存知识

3.简易函数——加法函数

4.进入——反汇编

5.​​​​​​​调用——main函数​​​​​​​

6.结果传回——返回值

1.寄存器

esp

栈指针寄存器:该指针指向栈帧的栈顶(栈顶指针) 

ebp

栈指针寄存器:该指针指向栈帧的底部(栈顶指针)

eax

累加器 (算数运算)

  2.内存知识

 

  3.加法函数

4.进入反汇编

调试过程中右击鼠标——反汇编

 调试过程中右击鼠标——不勾选符号名

 此时,符号名会转换为地址

注:

mov :数据传送指令

sub:减法指令

push:压栈操作

pop:弹出操作的指令

call:保存当前指令的下一条指令跳转到目标函数

大致框架:

 5.main函数的调用

  6.结果传回

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值