打印

赞叹的leave和enter指令

[复制链接]
117|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丑帅丑帅的|  楼主 | 2018-10-3 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
enter指令执行的实际上是两条指令:pushl %ebp

                                                          movl %esp, %ebp

这两条汇编指令是什么意思呢?首先我们要清楚的是,%ebp指向哪里,是什么意思?%ebp指向堆栈的栈底,%ebp表示栈底的地址,(%ebp)这个加了括号的才表示栈底地址对应的值。所以第一句是先esp即栈顶指针向下移动4个字节,然后将当前栈底地址保存到栈中,第二句的意思是,%ebp = %esp,即当前栈的栈底移动到先前的栈顶位置。即开辟了一个新栈,栈顶和栈底指向同一个地址,即是空栈。而之前的那个栈的开始地址(栈底)则被保存在新栈栈底的前一个地址中。



leave指令执行的是这两条指令:mov %ebp, %esp

                                                   popl %ebp

这条指令与上面那条指令恰恰相反,首先%esp指向%ebp,即改变栈顶的值,此刻栈顶指向了栈底的位置,然后将栈顶的值,也就是上面那条命令中所说的存储上一个栈的栈底地址,重新复制给%ebp,然后esp加四,指向先前栈的栈顶 。即回退到原来那个栈的状态。



当你理解了它之后,会觉得栈是如此精巧,不禁赞叹,设计栈的人真是个天才。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

741

主题

742

帖子

0

粉丝