Re: [理工] 计组 第一章

楼主: skyHuan (Huan)   2018-11-10 00:41:05
※ 引述《AAQ8 ()》之铭言:
: https://i.imgur.com/RJjsPLH.jpg
看懂这段程式前我们要先有两个概念
1. 原函式(caller)与被呼叫函式(callee)的关系
呼叫函式前因为callee会用到暂存器
所以要先将暂存器的变量存到stack中
以免原来在暂存器中的值被盖掉
导致callee return之后caller无法继续执行
一般储存变量到stack的工作由caller跟callee分工
caller负责存a开头跟t开头的暂存器
而ra跟s开头的暂存器交由callee负责存
原因是如果callee没有用到这些暂存器就可以不用花时间去存
2. 这个程式可以想成是这样运作的:
https://imgur.com/2brKrPw.jpg
所以是main呼叫f (此时main是caller、f是callee)
然后f呼叫func (此时f是caller、func是callee)
有了这两个概念后我们就来看这段程式
https://imgur.com/xizcMRg.jpg
因为f是main的callee又要当caller呼叫func
所以要store ra跟s开头的暂存器到stack中
以免等等被func改一改f回不去main
等callee return之后再load回来
这就是L1~L3跟L9~L11做的事情
而这边为什么要存s0我们等等再讨论
存完stack之后就可以呼叫func了
注意此时f是caller、func是callee
呼叫前应该要设定引数a0=a, a1=b
但原本的a0, a1里面就已经分别是a, b了
所以这里就不再多设定一次
而L4那行move s0 a2是在做什么的呢?
呼叫callee前caller应该要把等等callee return后
还要用的a开头暂存器存起来(就是a2=c这个值)
因为我们不知道func的运作
(func可能还要再call其他函式会用到很多引数)
照理来说存到stack是最简单的做法
(sp-4之后store到stack中等return后再load回来)
但这里用了另一个做法就是把a2暂存到s0之中
所以等callee return之后要用a2就直接去s0找即可
所以L4就是在把a2存到s0中
这就是为什么刚刚L1~L3在存stack的时候L3要多存一个s0
因为main跟f之间是caller跟callee的关系
而f (callee)这个函式要用到s0这个暂存器
所以在开始前要负责把main (caller)的s0内容先存起来
同理,当L5呼叫func函式之后
如果func中有要用到s0这个暂存器
也要在func开始前把s0存到stack中
(不过这就是func的事了跟我们现在在写f无关)
了解L4之后应该就海阔天空了
L5跳到func去执行函式return之后
回传值又要当作引数再呼叫一次func
L6, L7就是在做呼叫前的引数设定
L7这里就用到刚刚被我们存到s0的a2=c
L8这里一样引数设定完跳到func去执行函式
等return之后load回f最一开始被我们存进stack的变量
再来就可以返回main,就是L12
作者: a80242002 (宽宽)   2018-11-10 00:42:00
s大真的猛 每次都秒答XDDDL6 L7不是也是为了保护他吗?抱歉 我看错惹
楼主: skyHuan (Huan)   2018-11-10 00:56:00
不是喔L6, L7是在设定被呼叫函式的引数保护是要存到stack里面呼叫完return之后就不用再用到了所以不用保护,原则是尽量不存(有可能破坏到才会保护)
作者: a80242002 (宽宽)   2018-11-10 00:57:00
借版问个S大 page segmentation(先分段再分页) 这里分段是指给他刚好的大小吗?
楼主: skyHuan (Huan)   2018-11-10 01:11:00
我不是很确定欸OS还没看到那么后面><看了一下笔记洪逸说恐龙已经把这段移除了(?
作者: SIGNAL2017 (信号2017)   2018-11-10 07:17:00
请问:main也算是个caller,那为何他不需要去做那些caller应该做的事情呢,例如调出stack空间和存变量等等..我的意思是,如果这段code再加上main,就像你的第一张图那样,那我需要也再加上caller该做的事情吗还是说那个main本身只有呼叫功能没做啥事,所以也不需要去调出stack空间存return值等等?原来如此 感谢
作者: AAQ8 (不要就是要)   2018-11-10 22:03:00
感谢

Links booklink

Contact Us: admin [ a t ] ucptt.com