enter指令执行的实际上是两条指令:pushl %ebp
movl %esp, %ebp
这两条汇编指令是什么意思呢?首先我们要清楚的是,%ebp指向哪里,是什么意思?%ebp指向堆栈的栈底,%ebp表示栈底的地址,(%ebp)这个加了括号的才表示栈底地址对应的值。所以第一句是先esp即栈顶指针向下移动4个字节,然后将当前栈底地址保存到栈中,第二句的意思是,%ebp = %esp,即当前栈的栈底移动到先前的栈顶位置。即开辟了一个新栈,栈顶和栈底指向同一个地址,即是空栈。而之前的那个栈的开始地址(栈底)则被保存在新栈栈底的前一个地址中。
leave指令执行的是这两条指令:mov %ebp, %esp
popl %ebp
这条指令与上面那条指令恰恰相反,首先%esp指向%ebp,即改变栈顶的值,此刻栈顶指向了栈底的位置,然后将栈顶的值,也就是上面那条命令中所说的存储上一个栈的栈底地址,重新复制给%ebp,然后esp加四,指向先前栈的栈顶 。即回退到原来那个栈的状态。
当你理解了它之后,会觉得栈是如此精巧,不禁赞叹,设计栈的人真是个天才。 |