这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程”

这一节分为运行时栈、转移控制、数据传送、栈上的局部存储、寄存器中的局部存储空间和递归过程这 6 个小节

其中前 3 小节看懂了一部分内容,后面两个还没来得及看,下周看完补上

下面记录一下看懂的部分内容

首先,过程作为一种很重要的抽象(方法、函数都是过程),必然存在互相调用的情况,而过程调用有三个要点(以过程 P 调用过程 Q 为例):

传递控制:调用过程 Q 时,需将程序计数器指向 Q 的起始地址;调用结束之后,程序计数器需指向过程 P 调用 Q 指令之后的那条指令(该指令地址称为返回地址)

传递数据:P 向 Q 传递参数,Q 向 P 返回结果

分配和释放内存:Q 的执行可能需要新的内存空间,使用结束之后,需要将其释放

运行时栈

为函数分配的栈空间被称为栈帧,在调用的一开始,就会有定长的栈帧被分配,由于栈向下生长(栈顶的地址在整个栈空间中永远是最小的)。

所以,分配栈帧,在内存中的表现就是栈顶指针(%rsp)减小一个适当的量。

上面提到了,Q 在被调用时可能需要新的空间。

为什么是可能而不是一定呢?

因为当满足以下条件时,过程并不需要栈帧,只需要使用寄存器处理参数和局部变量即可,条件如下:

当所有的局部变量都可以保存在寄存器中,且该函数不会调用任何其他过程

转移控制

转移控制主要涉及 call 和 ret 这两条指令

call 指令将控制转移到一个过程的起始,主要做以下两件事:

跳转到目标过程的起始地址

将原过程中的返回地址压入栈中(放在原过程栈顶)

ret 指令弹出原过程栈顶的值,并跳转至对应的返回地址

数据传送

参数传递时,前 6 个参数会根据参数位置和数据大小选定对应的寄存器,规则如下表(来源于书):

如果参数的个数超过 6 个,那么超出的部分需要通过栈来传递(P 调用 Q 时,存储在 P 的栈帧中)

最新文章

  1. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用
  2. Python In Action:三、再来一个扩展例子,保证不难
  3. 查看外网出口IP && Traceroute
  4. 安装软件 报错1304 C:\Program Files\Common Files\VMware\VMware VMRC Plug-in\Firefox\dbghelp.dll验证您对该目录具有访问权限
  5. mysql常用命令(1)
  6. phpstorm 激活
  7. The name 'Scripts' does not exist in the current context error in MVC
  8. mips-linux-gnu-gcc
  9. 用linq实现登陆功能
  10. angular.js 字符串1
  11. Powershell创建对象
  12. 成功的背后!(给所有IT人)----转载:来自CSDN第一名博主
  13. hdu4280(最大流)
  14. opencv学习笔记(三)
  15. Linux 命令详解(五)cp 命令两个高效的用法
  16. 20180831xlVBA_WorksheetsCosolidate
  17. ajax 之POST请求,参数序列化
  18. e769. 在按钮组中选择一个单选按钮
  19. 再谈javascript图片预加载技术
  20. 怎样搭建一个自有域名的 WORDPRESS 博客?

热门文章

  1. 《java编程思想》P22-P37(第二章一切都是对象)
  2. API---文件操作
  3. 后渗透神器Cobalt Strike的安装
  4. go-数组-切片-字典
  5. C#刷遍Leetcode面试题系列连载(5):No.593 - 有效的正方形
  6. Vue系列---理解Vue.nextTick使用及源码分析(五)
  7. 基于Opentracing+Jaeger全链路灰度调用链
  8. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理六(二十四)
  9. 美团 iOS 端开源框架 Graver 在动态化上的探索与实践
  10. 函数基础(二)(day11整理)