首页 > 其他分享 >栈结构

栈结构

时间:2023-10-09 17:22:40浏览次数:27  
标签:存储 函数 压入 父栈 ebp callee 结构

栈结构

 

 

注意,ebp到esp位置的是如今栈针,而上方是父栈帧的内容。该图是32的栈帧,紧邻栈帧的stack frame pointer是上一个栈帧的栈顶,记录栈底指针的值,方便可以回去调用。variables是存储局部变量的区域。子栈帧的参数是保存在父栈帧的arguments区域。

esp用于存储栈顶位置,在push和pop时产生变化。ebp用于存储基地址,可以用来索引确定函数参数或者局部变量的位置。eip是用于存储即将执行的程序指令的地址。

如右图蓝色所示,caller是父栈帧,callee是当前栈帧,callee的参数被存储在caller的argument区域,父栈帧在被调用参数时,将参数倒序压入栈中,先将arg1压入栈顶。最后会将父函数地址的返回值压入栈中。

int sum(int x,int y){
return x+y;
}
int main(){
sum(1,2);
return 0;
}

拿以上的代码作为例子,main是父函数,会将两个参数1,2压入自己的arguments区域。且在调用了sum函数后还要回到主函数,所有如右图所示,还需要将基地址压入栈。

同时ebp现在指向的位置存储的是该栈帧的基地址,在pop ebp时,ebp存储的内容就是基地址,该栈帧的指针会移到该栈的初始位置。在pop之后,栈顶esp也要发生改变,减少一个字节。

 

注意call指令和jump指令不同,call指令会将下一条命令即23命令存入return address的位置,再调用到callee函数中。而jump直接跳转,不存储地址。

关注callee函数和caller函数的不同,caller函数直接leave,而callee函数需要将ebp的位置返回到父栈帧中去。

标签:存储,函数,压入,父栈,ebp,callee,结构
From: https://www.cnblogs.com/carol-YeXiao/p/17752234.html

相关文章

  • Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】
    〇、简介1、什么是桥接模式?一句话解释:  通过一个类的抽象,与另一个类的抽象关联起来,当做桥。此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来。桥接,顾名思义就是用桥来连接河两岸,将原本不关联的两部分联系起来,且不影响两岸的各自演化,演化出来的不同对......
  • 基础数据结构
    链表#链节点classNode:def__init__(self,item=0,next=None):self.item=itemself.next=next#链表classLinkedList:def__init__(self):self.head=Nonedefcreate(self,data):self.head=Node(data[0])......
  • gitHub项目显示tree结构方便查阅Octotree和github中文化Tampermonkey
    1.google,安装Octotree插件,这个自行搜索,安装完成2.打开项目会出现这样的界面,安装https://blog.csdn.net/Mango_Bin/article/details/111612142,这里面链接地址去设置 1.Tampermonkey,在github中搜索github-chinese,找到相应的仓库 2.往下划拉点击Tampermonkey去安装,安装完......
  • 十天学完基础数据结构-第二天(数据结构简介)
    什么是数据结构?在计算机科学中,数据结构是一种组织和存储数据的方式。它定义了数据的布局,以及对这些数据执行的操作。你可以把数据结构看作是计算机内存中的特定组织方式,就像图书馆中书籍的排列一样。数据结构可以是各种形式,包括数组、链表、栈、队列、树、图等等。每种数据结构都有......
  • HEVC的编码结构
    一.h.264的编码结构从编码原理看,H.264/AVC采用的是混合编码方式。从编码层次结构看,H.264/AVC采用的是分块式编码结构,将图像划分为若干宏块,主要编码操作针对宏块进行。宏块向下可以划分为多个更小的块或子块。向上可由若干宏块组成一个条,一帧图像则由数量不等的条组成。若干图像......
  • 树结构操作通用方法
    /***树操作通用方法,将一些常用方法提炼出来,方便使用。*@module树操作工具*/import{cloneDeep}from'lodash';import{uniqueArray,arrayRemoveAll,arrayRemove}from'./index';/***将数据转换成tree所需格式*@param{object}data要进行转换的object......
  • Redis——底层和数据结构
    数据结构简单动态字符串SDS可以认为在Redis中所有的东西最终都是字符串。Redis是C语言实现的,但是Redis没有直接使用C语言中的字符串,C语言字符串是字符数组实现的,存在很多问题:1、获取字符串的长度需要运算,时间复杂度达到O(n)。2、非二进制安全,无法保存\0字符(被识别成结束标识)......
  • MySQL体系管理结构
    MySQL客户端与服务端模型MySQL是C/S结构的服务MySQL客户端mysqlmysqladminmysqldump图形化SQLyognavicatMySQL服务端mysqldMySQL服务端的连接方式TCP/IP连接mysql-uroot-p123-h10.0.0.51Socket连接mysql-uroot-p123-S/app/mysql/tmp/mysql.sock......
  • 数据结构的关键码序列的理解概述
    1、关键码序列的理解所谓关键码序列,就是出现在二叉排序树中的,对二叉排序树的各个结点进行排序的一个结点序列。依据左子树的各个结点的值都小于父结点的值,右子树的各个结点的值都大于父结点的值的条件进行排序。2、习题解决一般都是给我们一个二叉排序树的图,让我们去判断选......
  • 05_数据结构与算法
    Sort排序算法sort包中实现了四种基本排序算法:插入排序、归并排序、堆排序、快速排序。但是它们不公开,只供sort包内部自己使用,所以在需要实现数据排序时不必考虑使用哪一种排序方法,只要实现了sort.Interface定义的三个方法:获取数据集合长度Len()、比较两个元素大小Less()、交......