引文
在日常学习c语言的过程中,你可能有许许多多的疑问:
- 局部变量是怎么创建的
- 为什么局部变量的值不做初始化就是随机值
- 函数是怎么传参的?传参的顺序是怎么样的?
- 形参和实参是什么关系?
- 函数调用是怎么做的?
- 函数调用结束后是怎样返回的?
要想了解其中的原因,我们就不可避免去研究c语言中更深层次的原理--汇编
为了清晰的入手深层原理,我们用加法函数做一个实验
目录:
1.栈帧的管理工具——寄存器
2.数据存储——内存知识
3.简易函数——加法函数
4.进入——反汇编
5.调用——main函数
6.结果传回——返回值
1.寄存器
esp |
栈指针寄存器:该指针指向栈帧的栈顶(栈顶指针) |
|---|---|
ebp |
栈指针寄存器:该指针指向栈帧的底部(栈顶指针) |
eax |
累加器 (算数运算) |
2.内存知识

3.加法函数

4.进入反汇编
调试过程中右击鼠标——反汇编

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

此时,符号名会转换为地址
注:
mov :数据传送指令
sub:减法指令
push:压栈操作
pop:弹出操作的指令
call:保存当前指令的下一条指令并跳转到目标函数
大致框架:

5.main函数的调用

6.结果传回

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





