1. 程式人生 > >深入理解計算機系統 第三章 程式的機器級表示 part3

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