C语言函数调用完整过程
2020-12-13 01:34
标签:寄存器 环境 content 指令 编译 方式 dex 其他 code 什么是堆桟? 以下面代码为例: C语言函数调用完整过程 标签:寄存器 环境 content 指令 编译 方式 dex 其他 code 原文地址:https://www.cnblogs.com/UnknowCodeMaker/p/11002225.htmlC语言函数调用详细过程
函数调用是步骤如下:
对函数的某些行为做出是商议,其中包括下面内容:
传参顺序:是从左往右传还是从右往左
传参方式:是用寄存器传还是使用内存传
平栈方式:是调用方平栈还是被调方平栈
返回值的传递方式:是用寄存器传还是使用内存传
一个程序运行的时候,它的进程的地址空间一般可以分为四块:
代码区,数据区,堆,栈,每块功能如下:
区域
功能
代码区
存放函数被编译后的二进制可执行代码
数据区
只读区:存放常量,例如:常量字符串,const修饰的全局变量等
可读写区:存放全局变量和静态变量
堆
除去其他三个区域,剩下的都是堆,不连续
栈
存放函数运行时所需的参数,寄存器环境,返回值,局部变量
函数参数参数传递: int TestFunction(char szBuff[],int nSize)
{
for (int iIndex = 0; iIndex
从上图中可以看出函数参数入栈
从上图中可以看出函数调用完成后,紧挨着的第一条指令为:
00EB175B add esp,8
所以,参数传递完成后就是返回值入栈:
调用方栈底保存完成后,当前的栈顶(ESP记录的地址)就成为被调用函数的栈底
这里程序为调试版本,所以为局部变量分配的空间比较大,在Release版本中
会根据局部变量实际所需空间来分配大小
这里一共保存了3个寄存器,共12字节,在Release版本下,只保存两个
在Debug版程序中(有/Zi(带有调试信息)和/Od(禁止优化)编译命令),除了为
局部变量分配较大的内存空间外,还会将分配的局部变量空间全部置为0xCC:
这种填充方式比较直观,能够让我们在调试时直观的观察到是否发生越界等错误
此时当前函数的栈的内存布局如下:
只是将当前的栈底指针(EBP)的值赋值给栈顶指针(ESP)就完成了:
函数流程转移到调用方
平栈