深入理解計算機系統 第三章 程式的機器級表示 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 的棧幀中)