关于IA-32过程调用和其中的push、leave、ret指令

最近在复(yu)习(xi)《计算机系统基础》这门课程,发现了寄叽还是有很多问题。当时在学的时候没注意到的小细节,现在在这里展开说说,就当是一个记录寄叽学习的过程。我这个人理解能力不太行,我能理解的话,应该大噶看了都能明白。

  1. 过程调用的执行步骤
    假定过程P调用过程Q,则P是调用者(caller),Q是被调用者。过程调用的执行步骤如下:
    ①P将入口参数(实参)放到Q能访问到的位置。
    ②P将返回地址存到特定的地方,然后将控制转移到Q。(返回地址就是CALL指令的下一条指令的地址)
    ③Q保存P的现场,并为自己的非静态局部变量分配空间。
    ④执行Q的过程体(函数体)。
    ⑤Q恢复P的现场,并释放局部变量所占空间。
    ⑥Q取出返回地址,将控制转移到P。

    上述步骤中,
    ①②是在过程P中完成的,其中②是由CALL指令实现的,通过CALL指令,将控制从过程P转移到了过程Q。
    ③④⑤⑥都是在被调用过程Q中完成的:
    在执行Q过程体之前的③通常称为准备阶段,用于保存P的现场并为Q的非静态局部变量分配空间,
    在执行Q过程体之后的⑤通常称为结束阶段,用于恢复P的现场并释放Q的局部变量。

  2. IA-32的栈、栈帧结构
    在了解程序指令代表的含义之前,先了解一下栈、栈帧是什么样子的。
    栈的高地址在上面,低地址在下面。
    在一个栈帧中,ebp(基址指针寄存器)指向的是栈帧的栈底,esp(栈指针寄存器)指向的是栈帧的栈顶。
    esp是由cpu机制决定的,pop、push指令都会自动调整esp的值。
    ebp只是存取某时刻的esp的值,这个时刻就是进入一个函数之后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数、局部变量等。实际上用esp也可以,设置ebp是为了方便程序员,因为esp的值会在函数运行时不断发生变化。

  3. push %ebp,mov %esp,%ebp详解
    绝大多数的程序的最前面两条指令都是这个,下面分析以下这两条语句干了什么:
    首先是push %ebp。当前ebp寄存器里保存的是调用者(caller)栈帧的栈底地址,那么push %ebp就是将调用者栈帧的栈底地址压入栈,即保存旧的ebp的值,这里esp的值会自动调整。
    然后是mov %esp,%ebp。刚刚把旧的ebp的值保存下来了,但是ebp的值并没有发生变化。而现在正在执行一个新的函数,那么应该让ebp保存的是新的栈帧的栈底,所以才让当前esp存储的地址赋给ebp。那么这样一来的话,就相当于调用者栈帧的栈顶现在作为了新栈帧的栈底(保存的ebp的旧值属于新栈帧的内容),并且该栈底保存的是调用者栈帧的栈底地址,而此时新的栈帧的栈底和栈顶位于同一个位置。而我们在函数里面是要执行各种操作的,所以我们需要给新栈帧分配一定的内存。在这之前,还可能有一些push语句,这些push语句都是保存调用者的值,以便在函数运行完后再恢复数据。

  4. leave ret指令详解
    leave指令可以使栈做好返回的准备,它等价于mov %ebp,%esp,pop %ebp。首先是mov %ebp,%esp,当前保存的ebp的值使栈帧的栈底地址,所以这一句话的作用就是把esp给放回到调用者栈帧的栈顶,联系到进入函数时的语句mov %esp,%ebp,其实就是这个的逆过程,旨在恢复原来栈顶的状态。然后是pop %ebp,pop是对栈顶元素出栈,而现在的栈顶(也是栈底)存储的是调用者栈帧的栈底地址,这条指令就是把这一地址赋值给ebp(把被保存的ebp的值赋给寄存器ebp)。所以这句话就是恢复调用者栈帧的栈底,这样一来的话调用者栈帧旧基本上恢复到原来的状态了。
    leave只是做好了返回的准备,我们调用完函数之后,调用者还需要接着向下执行指令,那么调用完函数以后就应该跳转到该函数的下一条指令的地址,我们的CALL指令就是先将下一条指令的地址入栈,然后跳转,这里ret的作用就是把那一个地址给弹出栈,并且跳转到地址对应的语句,再接着执行,这样一来一个函数就完整的执行了。

现在我能想到的内容就这么多,有什么想法之后会继续补充。
悲惨的期末人要继续复习了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值