【汇编】堆栈和画堆栈图

        根据咱们学汇编的经验呀,汇编用的最多的是寄存器和内存之间的不断相互传值传地址,井然有序。

       然而,你知道它们具体是怎么进行数据传递和交换的吗?

                                                           

       我们知道寄存器能够保存的数据量不多,所以需要存储大量数据的时候就需要保存到内存里面了

       那么:如果我存了一大堆数据,但是我想知道究竟存了多少数据,要怎么办呢?

                  如果我想在这对数据里面抽出某一个数据出来使用,要怎么抽呢?

                  用完这些数据是继续保存还是丢弃来呢?丢到哪里去呢?

                                    

                          针对以上种种问题,这里有个完美的解决方案—〉堆栈 

                                               

                                         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”的函数后,需要执行以下的指令↓↓↓↓↓↓↓↓↓↓

                           ↓↓↓↓↓↓↓↓↓↓所以,“准备工作”堆栈图如下↓↓↓↓↓↓↓↓↓↓            

                                  ↓↓↓↓↓↓↓↓↓↓然后,执行完程序之后,堆栈的收尾工作如下↓↓↓↓↓↓↓↓↓↓

         

猜你喜欢

转载自blog.csdn.net/qq_41884002/article/details/81452889