如何详细分析C语言函数调用的长尾堆栈追踪过程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1053个文字,预计阅读时间需要5分钟。
目录
一、C函数栈帧开启及退出过程
二、C函数调用约定和返回值
一、C函数栈帧开启及退出过程 二、__cdecl(C语言默认调用方式,函数参数8字节以内,使用push指令。本节采用此方式)目录
- 一、C函数栈帧开辟以及回退过程
- 二、C函数调用约定和返回值
一、C函数栈帧开辟以及回退过程
__cdecl(C语言默认调用方式,函数参数8字节以内,使用push。本节采用此方式)
main函数的栈帧调用sum函数的栈帧,sum函数栈帧使用完了以后回退都是怎么进行的,要搞清楚这个问题必须得看汇编代码,汇编代码分为两种:inter x86(windows)和AT&T(unix)。这两种汇编非常相似,x86的汇编是从右向左看,unix的汇编是从左向右看的。
局部变量都是通过栈底指针ebp偏移访问,不生成符号,不属于数据,属于指令。
形参压栈在C/C++中是从右向左压栈,因为要支持可变长参数,如果从左向右,编译器就不知道用户传入了多少实参,形参内存是在调用函数栈帧中开辟,每压栈一个实参,都会开辟一个形参的空间,栈顶指针esp都会减4字节。
实参压栈完成后需要调用call指令来执行sum函数,执行完sum函数后,执行完sum函数后需要回到调用指令(call)的下一条指令继续执行。
本文共计1053个文字,预计阅读时间需要5分钟。
目录
一、C函数栈帧开启及退出过程
二、C函数调用约定和返回值
一、C函数栈帧开启及退出过程 二、__cdecl(C语言默认调用方式,函数参数8字节以内,使用push指令。本节采用此方式)目录
- 一、C函数栈帧开辟以及回退过程
- 二、C函数调用约定和返回值
一、C函数栈帧开辟以及回退过程
__cdecl(C语言默认调用方式,函数参数8字节以内,使用push。本节采用此方式)
main函数的栈帧调用sum函数的栈帧,sum函数栈帧使用完了以后回退都是怎么进行的,要搞清楚这个问题必须得看汇编代码,汇编代码分为两种:inter x86(windows)和AT&T(unix)。这两种汇编非常相似,x86的汇编是从右向左看,unix的汇编是从左向右看的。
局部变量都是通过栈底指针ebp偏移访问,不生成符号,不属于数据,属于指令。
形参压栈在C/C++中是从右向左压栈,因为要支持可变长参数,如果从左向右,编译器就不知道用户传入了多少实参,形参内存是在调用函数栈帧中开辟,每压栈一个实参,都会开辟一个形参的空间,栈顶指针esp都会减4字节。
实参压栈完成后需要调用call指令来执行sum函数,执行完sum函数后,执行完sum函数后需要回到调用指令(call)的下一条指令继续执行。

