【汇编】堆栈和画堆栈图
根据咱们学汇编的经验呀,汇编用的最多的是寄存器和内存之间的不断相互传值传地址,井然有序。
然而,你知道它们具体是怎么进行数据传递和交换的吗?
我们知道寄存器能够保存的数据量不多,所以需要存储大量数据的时候就需要保存到内存里面了
那么:如果我存了一大堆数据,但是我想知道究竟存了多少数据,要怎么办呢?
如果我想在这对数据里面抽出某一个数据出来使用,要怎么抽呢?
用完这些数据是继续保存还是丢弃来呢?丢到哪里去呢?
针对以上种种问题,这里有个完美的解决方案—〉堆栈
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”的函数后,需要执行以下的指令↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓所以,“准备工作”堆栈图如下↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓然后,执行完程序之后,堆栈的收尾工作如下↓↓↓↓↓↓↓↓↓↓