精品国产一区二区三 , 亚洲综合五月 , 俄罗斯特级高清毛片免费 , 激情福利,久久久日本,欧美一三区,欧美黄色大片久久

C語言

C函數(shù)的調用過程

時間:2025-02-13 20:04:32 C語言 我要投稿
  • 相關推薦

C函數(shù)的調用過程

  在C代碼中通過asm或__asm__嵌入一些匯編代碼,如進行系統(tǒng)調用,使用寄存器以提高性能能,需要對函數(shù)調用過程中的堆棧幀(Stack Frame)、CPU寄存器、GCC inlie assembly等了如指掌,F(xiàn)在看看函數(shù)調用過程吧。

C函數(shù)的調用過程

  1. Linux 進程虛擬地址空間

  以32位操作系統(tǒng)為例,下面是Linux進程地址空間布局:

  32位虛擬地址空間的高1GB的空間是留給操作系統(tǒng)內核的,棧由高地址到低地址向下增長,堆由低地址到高地址向上增長。

  C中如 malloc 等分配的內存在堆中分配。初始化了的靜態(tài)變量和全局變量放在Data段中。未初始化的全局變量和局部靜態(tài)變量放在Bss段中,更準確的說是在Bss段為它們預留了空間。非靜態(tài)局部變量是在函數(shù)調用過程中暫存在棧上的。

  2. 函數(shù)的堆棧幀

  棧在程序運行中具有舉足輕重的地位。最重要的,棧保存了一個函數(shù)調用所需要的維護信息,被稱為堆棧幀(Stack Frame),一個函數(shù)(被調函數(shù))的堆棧幀一般包括下面幾個方面的內容:

 。1) 函數(shù)參數(shù),默認調用慣例情況下從右向左的順序依次把參數(shù)壓入棧中。由函數(shù)調用方執(zhí)行。

 。2) 函數(shù)的返回地址,即調用方調用此函數(shù)(如call func1)的下一條指令的'地址。函數(shù)調用方(call指令)執(zhí)行。

 。3) 保存調用方函數(shù)的EBP寄存器,即將調用方函數(shù)的EBP壓入堆棧,并令EBP指向此棧中的地址:pushl %ebp; movl %esp, %ebp。由被調函數(shù)執(zhí)行。

 。4) 上下文:保存在函數(shù)調用過程中需要保持不變的寄存器(函數(shù)調用方的),如ebx,esi,edi等。由被調函數(shù)執(zhí)行。

 。5) 臨時變量,如非靜態(tài)局部變量。

  下面是一個函數(shù)的堆棧幀結構圖:

  壓入函數(shù)參數(shù)和返回地址的過程是由函數(shù)調用方在調用函數(shù)之前將其壓入棧中,每個函數(shù)執(zhí)行后首先要執(zhí)行的就是把函數(shù)調用方的EBP寄存器壓入棧中,之后是在棧上開辟一些空間存放局部變量,最后把要保存的寄存器壓入棧中。

【C函數(shù)的調用過程】相關文章:

匯編調用C函數(shù)02-02

C/C++函數(shù)調用的方式07-29

C++調用C函數(shù)的方法05-21

java調用c函數(shù)的實例04-25

C語言函數(shù)的運用及調用05-10

C語言函數(shù)的遞歸調用05-17

C語言函數(shù)調用與參數(shù)傳遞08-05

C++如何調用matlab函數(shù)06-29

C語言函數(shù)的遞歸和調用05-09