background image

    
3.压栈和进栈指令简介:

    

 

压栈指令 :     pushx    source

    

 

其中, 'x'

  

可以是 'w'(表示字), 或者是'l'(表示长字);source 可以是数值或者寄存器值或者

内存地址;

    

       

出栈指令 :

popx    des

    同样,'x'

  

可以是 'w'(表示字), 或者是'l'(表示长字);des 可以是寄存器值或内存值;

    关于最最基本的东西已经讲得差不多了,当然还有其他一些基本东西,留给大家去查
资料了,这部分讲的都和本文有密切关系的东西。

二、函数如何通过堆栈来解决问题:

    这部分是对函数如何通过堆栈解决函数调用以及参数传递的理论性理解,相当重要,
只有了解之后才可以进行实例的分析,这一大部分同样分成几个小部分:

1.通过堆栈操作实现参数的传递:

  
前面说过,堆栈的基本操作可以是压栈和出栈,而参数的传递就是通过这种方式来实现
的。ESP 永远指向了堆栈顶部,如果这时候压进一个 int 型的数据元素,那么 ESP 向下移
动了 4 个字节,这时候它还是指向了堆栈的顶部(注意了,顶部的地址比移动前的地址
低,不要乱了)。假如把一个 int 型数据元素出栈,那么 ESP 向上移动 4 个字节,这时候
它还是指向了堆栈的顶部,只是现在地址是增加了 4 个字节。所以,如果一个函数需要传
递参数过去那么就得在调用函数之前先把参数压进栈,然后再调用。关于这点后面我会详
细说一下,现在你如果没理解也没关系。

2.函数调用的一般汇编指令:

    函数调用的一般汇编指令都是那么几条,下面我把他们按一般顺序罗列出来:

    #Asm Code
    
    function:
            pushl    %ebp
            movl    %esp, %ebp
            subl    $8, %esp
            #...
            movl    %ebp, %esp
            popl    %ebp