深入理解计算机系统 第三章 程序的机器级表示 part3
这周看了刘老师提供的相关视频,以及书中对应的章节“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 的栈帧中)
最新文章
- 【道德经】漫谈实体、对象、DTO及AutoMapper的使用
- Python In Action:三、再来一个扩展例子,保证不难
- 查看外网出口IP &;&; Traceroute
- 安装软件 报错1304 C:\Program Files\Common Files\VMware\VMware VMRC Plug-in\Firefox\dbghelp.dll验证您对该目录具有访问权限
- mysql常用命令(1)
- phpstorm 激活
- The name 'Scripts' does not exist in the current context error in MVC
- mips-linux-gnu-gcc
- 用linq实现登陆功能
- angular.js 字符串1
- Powershell创建对象
- 成功的背后!(给所有IT人)----转载:来自CSDN第一名博主
- hdu4280(最大流)
- opencv学习笔记(三)
- Linux 命令详解(五)cp 命令两个高效的用法
- 20180831xlVBA_WorksheetsCosolidate
- ajax 之POST请求,参数序列化
- e769. 在按钮组中选择一个单选按钮
- 再谈javascript图片预加载技术
- 怎样搭建一个自有域名的 WORDPRESS 博客?
热门文章
- 《java编程思想》P22-P37(第二章一切都是对象)
- API---文件操作
- 后渗透神器Cobalt Strike的安装
- go-数组-切片-字典
- C#刷遍Leetcode面试题系列连载(5):No.593 - 有效的正方形
- Vue系列---理解Vue.nextTick使用及源码分析(五)
- 基于Opentracing+Jaeger全链路灰度调用链
- abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理六(二十四)
- 美团 iOS 端开源框架 Graver 在动态化上的探索与实践
- 函数基础(二)(day11整理)