C语言函数栈桢理解

2023-12-26 20:20
文章标签 语言 函数 理解 栈桢

本文主要是介绍C语言函数栈桢理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、宏观背景

当执行一个程序后,实质就是启动一个进程,OS创建该进程对应的PCB对其进行管理,其中就包括空间分配。各个区域(堆区、栈区、代码区等)可用空间大小OS自动分配,当进程跑起来就会根据代码在堆区栈区划分空间,而运行中维护当前栈区的两个寄存器就是栈顶指针ebp和栈底指针esp,寄存器里面存放当前使用的栈空间边界地址(栈区使用习惯是从高地址到低地址)。

二、具体流程(只研究esp和ebp)

1、main函数内,ebp指向A,esp指向B,在维护的空间内创建临时变量,地址一般从高往低分配,实际读变量值的时候用的是该变量的低地址,然后往高地址加上步长-1就是该变量的存放空间,再根据大端(高位存低地址)或小端(低位存低地址) 就能读出里面变量的值;

2、当调用ADD函数的时候,会先把两个实参先拷贝(先右后左)给寄存器并入栈(这就是所谓形参,所以形参是实参的临时拷贝),再把ADD函数执行完下条指令的地址入栈,再把main函数的ebp值入栈,然后esp赋值给ebp,ebp指向G处,esp扩张栈空间指向H处,一顿操作后再把栈空间初始化(一般0xcccccccc);

3、计算结束后会把结果存在寄存器里面(如eax)到时候给c变量,同时esp指向ebp的位置G(此时ADD的栈桢销毁),再将FG之间ebp之前的值弹出给ebp,ebp就知道了最初的位置A,回指到A,最后弹出call(调用ADD)指令下一条指令的地址,然后销毁ecx、eax的栈桢,最后继续原来main内的操作。

注:每次push到当前维护栈顶之上,esp就会自动上移(往更低地址走)。

这篇关于C语言函数栈桢理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540668

相关文章

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初