最近在复(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的作用就是把那一个地址给弹出栈,并且跳转到地址对应的语句,再接着执行,这样一来一个函数就完整的执行了。

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

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

  1. 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll

    java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...

  2. 汇编 无条件转移和过程调用指令

    (1)JMP无条件转移指令 指令格式: JMP 目的 指令功能: 使程序无条件地转移到指令中指定的目的地去执行. 这类指令又分为两种类型: 第一种类型:段内转移或近(NEAR)转移,转移指令的目的地址 ...

  3. RPC(Remote Procedure Calls)远程过程调用

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  4. Aarch64过程调用标准

    前言 Aarch64过程调用标准(AAPCS64)描述了在ARM 64位体系结构下应用程序二进制接口(ABI)在过程调用中应遵循的调用约束,涉及寄存器使用规则.堆栈布局.函数参数传递以及返回值保存等内 ...

  5. RabbitMQ教程远程过程调用RPC

    前言:在前面的教程里我们学习了工作队列,实现了将工作任务发给不同的工人,如果任务是需要在另一台计算机上运行,我们如何实现运行远程计算机上的一个函数任务并等待其返回的结果呢,这种模式通常被称为远程过程调 ...

  6. 阴间指令集MIPS简介:汇编,IO,过程调用与冒泡排序

    目录 前言 MIPS指令集简介 MIPS资源 寄存器资源 内存资源 MIPS指令 算数指令 数据传输指令 逻辑指令 分支跳转指令 MIPS模拟器 编译并且运行简单求和程序 MIPS模拟器中的汇编 MI ...

  7. Windows RPC 远程过程调用

    本文章转载自 http://blog.csdn.net/xxxluozhen/article/details/5605818  作者写的很详细并且通俗易懂 一.什么是远程过程调用 什么是远程过程调用 ...

  8. 远程过程调用RPC简介

    RPC(Remote Procedure Call, 远程过程调用):是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想. RPC是一种技术思想而非一种规范或协议,常见RPC技术 ...

  9. 进程间通信 IPC 的本地过程调用 LPC(Local Procedure Call)和远程过程调用 RPC(Remote Procedure Call)

    进程间通信(IPC:Inter-Process Communication)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术.有两种类型的进程间通信(IPC). 本地过程调用(LPC ...

最新文章

  1. 2021 年音视频技术与发展
  2. Validate + Boostrap tooltip 表单验证示例
  3. /usr/lib/sudo/sudoers.so must be only be writable by owner
  4. 宏定义#define
  5. springsecurity 不允许session并行登录_Spring Security 实战干货:实现自定义退出登录...
  6. java levenshtein算法_DNA分析 拼字检查 语音辨识 抄袭侦测 - Levenshtein算法
  7. 数据结构思维 第五章 双链表
  8. 关于复旦大学英语水平测试和计算机应用能力水平测试成绩记载事宜的说明,复旦大学水平测试(FCT、FET)近期通知概览 | 一周复旦热问...
  9. unity, 不要用TextMesh,用图片代替
  10. 【strtok()】——分割字符串
  11. js轮播图片小圆点变化_原生js实现轮播图的示例代码
  12. 品牌如何正确联动B站UP主“恰饭视频”,最近一支不像恰饭视频的作品在B站火了
  13. win服务器系统无法切换输入法,win10输入法切换不了怎么办?win10无法切换输入法现象的解决方法...
  14. 计算机社团打字比赛规则,金手指打字比赛策划(最终版)
  15. 直播安全体系、播放安全、推流安全以及内容安全方案分享
  16. 人脑是一台计算机吗?
  17. 正则,把字符串/替换成-
  18. Cannot change network to bridged: There are no un-bridged host network adapters解决方法
  19. 2018年第九届C/C++ A组蓝桥杯省赛真题(python解法)
  20. 计算机毕业设计Java疫情期间社区出入管理系统(系统+源码+mysql数据库+Lw文档)

热门文章

  1. 海阔凭鱼跃,天空任鸟飞,你也一定可以
  2. 已解决:目标文件过大,无法复制到U盘
  3. MATLAB算法实战应用案例精讲-【深度学习】多尺度特征提取
  4. git 切换远程分支
  5. 百宝云注册码系统新手教程
  6. PC端和移动端刮卡效果
  7. 衡量一款工程监测振弦采集仪是否好用的标准是什么呢?
  8. Photoshop: Coloring Comic Book Characters 如何用Photoshop给漫画人物上色 Lynda课程中文字幕
  9. 女人秋季养生食谱大全
  10. 不管我活着,还是我死去,我都是一只牛虻