深入理解计算机系统 第三章 程序的机器级表示 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 的栈帧中)
深入理解计算机系统 第三章 程序的机器级表示 part3的更多相关文章
- 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...
- 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...
- 深入理解计算机系统 第三章 程序的机器级表示 part1
如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代 ...
- 深入理解计算机系统 第三章 程序的机器级表示 part2
这周由于时间和精力有限,只读一小节:3.4.4 压入和弹出栈数据 栈是一种特殊的数据结构,遵循“后进先出”的原则,可以用数组实现,总是从数组的一端插入和删除元素,这一端被称为栈顶. 栈有两个常用指令 ...
- CSAPP:第三章程序的机器级表示3
程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈 x86-64的栈向低 ...
- CSAPP:第三章程序的机器级表示2
CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作 如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类( ...
- CSAPP:第三章程序的机器级表示1
CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式 术语字(word)表示16位数据类型,32位数为双字(double words), ...
- 【CSAPP】第三章 程序的机器级表示
目录 1. 数据的编码与存储 2. 汇编指令 2.1 数据传送指令 访存方式 数据传送指令 入栈出栈 2.2 算术/逻辑指令 2.3 过程控制指令 控制码 比较指令 跳转指令 条件设置指令 3. 程序 ...
- 【CSAPP】三、程序的机器级表示
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...
随机推荐
- 前端深入之css篇丨2020年前,彻底掌握css动画【animation】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- Ubuntu php + apache
Ubuntu 环境: 问题1: apache 不能解析 *.php 文件 安装apache的扩展模块 : apt-get install libapache2-mod-php 问题2 : 客户端访问 ...
- My Idea About ID wly_sh (关于用户名 wly_sh 的猜想)
I Wanna Say Is That- There's a guy called wsh in our computer room. That guy registered a blog in CS ...
- Figures Inscribed in Curves (曲线上的图形)
Figures Inscribed in Curves\text{Figures Inscribed in Curves}Figures Inscribed in Curves A short tou ...
- [JOYOI1307] 联络员
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐 ...
- java 线程池那点事儿
1.为什么要用线程池 2.常见线程池以及参数 2.1 创建线程池 2.2 线程池参数 2.3 常见线程池 3.执行流程 4.健康检查 1.为什么要用线程池 线程池提供了一种任务的提交与任务的执行解偶的 ...
- libevent::日志
LibEvent 能记录内部的错误和警告日志,如果编译进日志支持功能,也会记录调试信息.默认情况下这些消息都是输出 到 stderr,你也可以通过提供自己的日志函数的方法来覆盖这种行为. 为了覆盖 L ...
- vue —— Toast 内 加变量
toast正常使用: 在页面内引入: import { Toast } from 'mint-ui' 使用的时候,简单到飞起: Toast('领取成功'); 而如果想在toast中加入变量,也很简单: ...
- JS实现生成一个周对应日期数组
/* 获取日期和周 */ getDateWeek() {/* 得到当前日期的时间戳 */ const timestamp = Date.now() // const timestamp = new D ...
- 【RabbitMQ 实战指南】一 死信队列
1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DL ...