堆栈
根据咱们学汇编的经验呀,汇编用的最多的是寄存器和内存之间的不断相互传值传地址,井然有序。
然而,你知道它们具体是怎么进行数据传递和交换的吗?
我们知道寄存器能够保存的数据量不多,所以需要存储大量数据的时候就需要保存到内存里面了
那么:如果我存了一大堆数据,但是我想知道究竟存了多少数据,要怎么办呢?
如果我想在这对数据里面抽出某一个数据出来使用,要怎么抽呢?
用完这些数据是继续保存还是丢弃来呢?丢到哪里去呢?
针对以上种种问题,这里有个完美的解决方案—〉堆栈
NO.1 首先我们来了解下什么是堆栈
根据百度百科的记载,堆栈的定义如下
顾名思义,就是在调用程序的时候,电脑会自动开辟一块内存空间专门用来放数据的,然后我们的数据就会想货物一样一个一个往上堆,需要用到的时候就拿出来使用,当程序执行完之后再腾出空间给其他程序继续使用,这个就是堆栈。
这里两个概念需要了解下,一个是栈顶,一个是栈底。
栈顶:顾名思义,就是栈道的顶部啦~
栈底:顾名思义,就是栈道的底部啦~
然后呢,通常我们规定使用寄存器里面的EBP寄存器保存一个地址,作为堆栈的栈底,ESP寄存器保存一个地址,作为堆栈的栈顶,用EAX寄存器来保存需要输出的数据。
举个例子,可以看到,有个寄存器EBP和ESP所保存的地址如下↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓所以它们在堆栈中是这样的↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓现在要实现以下功能↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
以上的指令含义分别为:1.将立即数“2”压进栈道里,并且栈顶提升4个字节
2.将立即数“1”压进栈道里,并且栈顶提升4个字节
3.进入名为“kong”的函数,把地址“0040100F”保存到EIP寄存器 里,并且把00401070(0040106c+0x4)压进栈道,并且栈顶提升4个 字节
4.从函数中出来以后,栈顶esp+8(恢复栈顶)
↓↓↓↓↓↓↓↓↓↓进入名为“kong”的函数后,需要执行以下的指令↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓所以,“准备工作”堆栈图如下↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓然后,执行完程序之后,堆栈的收尾工作如下↓↓↓↓↓↓↓↓↓↓
相关阅读
转自:https://blog.csdn.net/lk274857347/article/details/77512555基本概念1.寄存器:最快的存储区, 由编译器根据需求进行分配,我
堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特
ARM汇编指令集汇总 作者:毛茏玮 / Saint掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a微博:https://weibo.com/5458277467/
JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。基本,栈stack和堆heap这
堆和栈的区别:一、堆栈空间分配区别:1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据