C語言底層呼叫的實現機制

2021-09-30 08:03:24 字數 548 閱讀 1514

call指令其實隱式完成了乙個push操作,把下一條語句的位址push進了堆疊,當然是在引數之後被push進堆疊。為了保持堆疊平衡,就要有乙個pop相對應,這個pop在函式退出的時候由ret指令完成,類似於call,ret隱式完成了乙個pop操作,把call壓入堆疊的位址pop出去,然後回到了這個位址,也就是我們常說的返回位址。

這裡還涉及到乙個呼叫規範的問題,其實核心就是堆疊由誰來平衡的問題,是由呼叫者還是被呼叫者。windows的api函式宣告為winapi呼叫,winapi其實就是__stdcall呼叫規範,引數由右像左被push進堆疊,被呼叫函式返回前自己平衡堆疊,表現為ret n的**。c語言預設的呼叫規範是__cdecl,此呼叫規範引數的入棧順序也是由右向左,但是是有呼叫者來平衡堆疊,被呼叫函式用ret返回,呼叫函式在被呼叫函式返回後用add esp,n來平衡堆疊。

此外,其它的呼叫規範還有__fastcal,也是由被呼叫者平衡堆疊,入棧順序有一點特殊,還不是很明白。

從堆疊由誰來平衡,可以看出__stacll和__fastcal生成的**要小於__cdecl規範,因為__cdel每呼叫一次都要有平衡堆疊的**。

函式呼叫的底層機制

int fun int a,int b int main 之後,最關鍵的是在專案設定裡關閉優化功能。也就是把project setting c c optimizations選為disabled。編譯器的優化在分析底層實現時大多數情況不太受歡迎。按鍵盤上的f10鍵,進入單步除錯模式 step ove...

函式呼叫的底層機制

int fun int a,int b int main 之後,最關鍵的是在專案設定裡關閉優化功能。也就是把project setting c c optimizations選為disabled。編譯器的優化在分析底層實現時大多數情況不太受歡迎。按鍵盤上的f10鍵,進入單步除錯模式 step ove...

C 的底層機制

c 為我們所提供的各種訪問控制僅僅是在編譯階段給我們的限制,也就是說是編譯器確保了你在完成任務之前的正確行為,如果你的行為不正確,那麼你休想構造出任何可執行程式來。但如果真正到了產生可執行 階段,無論是c,c 還是pascal,大家都一樣,你認為c和c 編譯器產生的機器 會有所不同嗎,你 認為c 產...