如何详细分析C语言函数调用的长尾堆栈追踪过程?

2026-04-12 07:451阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1053个文字,预计阅读时间需要5分钟。

如何详细分析C语言函数调用的长尾堆栈追踪过程?

目录

一、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函数调用约定和返回值

一、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)的下一条指令继续执行。

阅读全文