Re: [理工] 計組 第一章

作者: mistel (Mistel)   2019-07-15 09:58:50
※ 引述 《skyHuan (Huan)》 之銘言:
:  
: ※ 引述《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去執行函式
不好意思挖一下sky大大曾經回答過的古文來再問一下
move $s0, $a2
作者: skyHuan (Huan)   2019-07-15 14:23:00
ax是用來存引數給呼叫的函式用的,通常一進到函式就會被使用。而tx是用來存運算過程中暫時的結果,通常沒有保留的必要,所以呼叫callee的時候不會特別讓callee去存他,如果caller本身在return之後有使用需求,就要在呼叫函式前自己先存好,return回來之後才有辦法使用。這個例子a0,a1已經使用完不會再用了但a2還沒,所以才先存起來return後才有辦法使用他
作者: mistel (Mistel)   2019-07-15 14:58:00
所以你的意思是,從這題來看因為a0,a1的引數在呼叫funct時就已經用掉且之後不會再用了,所以不用存起來看,但a2在return後因為我之後還要用且不知道funct的功能是什麼所以我要把他存起來,這樣子對嗎?
作者: jls16457 (只是路過)   2019-07-15 21:37:00
我覺得不是這個意思欸,應該是說a,b還要繼續作為arguments被使用,所以不用存到saved去,但是c因為不會用到,而且不確定a3會不會被funct用掉,所以才把a3的內容存到s0讓funct把他存到stack裡
作者: mistel (Mistel)   2019-07-16 00:46:00
我覺得我應該是對的耶,因為caller確定c之後會被使用到,但是a,b丟給funct後就已經不會用到了,所以caller就不再特地存下a,b我的意思是caller在第一輪呼叫funct的時候確定不會用到c但之後會用到,又不確定funct功能,所以存下來,但a,b再第一次呼叫後就不會用到了,所以不存「如果caller在return之後還會用$ax的值,那caller就要自己存下來」 這句話是關鍵
作者: skyHuan (Huan)   2019-07-16 02:10:00
對喔m大說的是對的~
作者: mistel (Mistel)   2019-07-16 13:47:00
感謝sky大!

Links booklink

Contact Us: admin [ a t ] ucptt.com