备战2020校招日记----4.13

本文详细探讨了《深入理解计算机系统》一书中关于过程调用的章节,解析了过程调用的三大核心步骤:控制转移、参数与返回值传递、局部变量分配。重点介绍了栈帧在实现过程调用中的作用,以及x86-64架构下如何通过栈和区分不同寄存器来避免寄存器间的干扰。

0.背景----我太菜了

  • 最近打算全身心投入复习,个人感觉,相比考研来说,不用复习数学英语,只用考虑专业课就行了,而专业课之间是相通的。我比较喜欢这种比较集中的学习。准备投C++后端。
  • 一个人在家,为了防止自己不自觉地懈怠,打算以后每天睡前花半小时“闭卷”写一篇日记发出来,仅仅是一种自我监督,或者说假想的群体监督,不作为技术博客。记录我每一个笨蛋且执着的一天。

1. 今日学习内容

今天主要看了《深入理解计算机系统》中的“程序的机器级表示”的后面几个章节,主要看了过程调用的概念及其实现。

过程调用

过程有很多名字,例如函数、方法、例程等等,实现原理都是类似的。 ----------- 就是栈帧。

栈帧

通过前两天看第一章里面说的,进程是建立在指令集架构和虚拟内存的基础上的,由于我现在对于进程还没有较为具体准确的认知,我暂且认为进程和过程是一样的。
那么过程就是建立在指令集架构虚拟内存的基础上的。栈就是虚拟的内存。
栈帧是如何实现过程调用的呢?
过程调用主要需要完成3件事情:

  1. 控制转移。 – 讲的是call指令和ret指令做了什么。前者是将下一条指令地址入栈,然后进入过程代码(也就是将call指定的地址放入PC中),后者是将刚才入栈的地址pop到PC中。
  2. 参数和返回值传递。参数传递是用特定的寄存器的,怎么个特定?就是通过参数的位置+参数大小(类型)来规定使用的寄存器,也就是说编译器会遵循某一套规则。返回值的话,也一样,就是通过特定的一个寄存器,%rax。
  3. 局部变量分配。这个和第二点似乎有一些重合,主要讲述在连续发生若干个过程调用的时候,如何做到寄存器之间互不干扰。因为从参数和返回值的传递中我们可以看到,不同的过程是共享一套寄存器的,子过程对于寄存器的操作,对于主过程是直接可见的,例如%rax就是典型。但是寄存器的数量是有限的,如何做到互不干扰呢?如何做到逻辑上我们常说的:不同的函数有自己的空间?x86-64对这个问题的解决办法是:栈+区分不同的寄存器。因为我们一旦将一个寄存器作为目标数,那么就一定会对其造成覆盖,那么原来的值需要保存吗?如何保存?

根据寄存器的不同,划分为两种方案:
- 由调用者保存,也就是说在call之前,将我关心的寄存器入栈保存(或者也可以不保存,总之这些寄存器的修改由调用者自己负责),这样的话子过程可以直接覆盖,子过程也知道,这个寄存器的保存不归我管。
- 由被调用者保存,也就是说我在使用一个寄存器之前,必须先将其入栈保存,用完之后在将其恢复,也就是说子过程需要保证这些寄存器的恢复。
- 总之,就是某些寄存器是需要子过程恢复的,而另一些则大家随便用,谁用谁负责,自己对自己负责。

以上,主要就学了这么点,书上还有很多细节。已经想不起来了。明天加油。

明日目标

  1. 明天需要做两道算法题。
  2. 偶数天的上午看视频,侯捷的C++。
  3. Linux使用扫盲视频。
  4. 晚上看完《深入理解计算机系统》第三章的最后两节,数组和结构体。任务很重,尽量完成,至少看完一个数组吧。

写了快50分钟,赶紧洗漱睡觉!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值