3.7 過程
過程是軟件中的一種很重要的抽象。它提供了一種封裝代碼的方式,用一組指定的參數和一個可選的返回值實現了某種功能。
3.7.1 運行時棧
C語言使用棧數據結構提供的後進先出的內存管理原則。
3.7.2 轉移控制
將控制從函數P
轉移到函數Q
只需要簡單地把程序計數器(PC
)設置爲Q
的代碼的起始位置。
call
指令有一個目標,即指明被調用過程起始的指令地址。
示例:
3.7.3 數據傳送
過程調用還可能包括把數據作爲參數傳遞,而從過程返回還有可能包括返回一個值。
超出6
個參數傳遞的例子:
3.7.4 棧上的局部存儲
局部數據必須存放在內存中,常見的情況有:
1) 寄存器不足夠存放所有的本地數據;
2) 對一個局部變量使用地址運算符’&‘
,因此必須能夠爲它產生一個地址;
3) 某些局部變量是數據或結構,因此必須能夠通過數據或結構引用被訪問到。
3.7.5 寄存器中的局部存儲空間
寄存器是唯一被所有過程共享的資源。
據慣例,寄存器 %rbx
%rbp
和 %r12
~%r15
被劃分爲***被調用者保存寄存器***。所有其他的寄存器,除了棧指針 %rsp, 都分類爲***調用者保存寄存器***。
示例:
3.7.6 遞歸過程
示例: