函式呼叫規則

2021-08-18 17:16:28 字數 990 閱讀 1719

2023年4月12日星期四

函式呼叫規則

函式呼叫過程:可在vc上逐步除錯檢視暫存器,記憶體的變化情況

1.一些暫存器的用法

// ebp eip  esi

// push pop(影響esp的值)  

eip(1.放的是當前執行**(當前指令)的位址

2.call,ret(從當前函式返回),這倆指令將會影響eip的值

break,// 可翻譯為jmp(無條件跳轉))

jne//text

data

heap

stack

2.【z = fun(x,y): move eax,[ebp-8h]  push eax】eax(累加器)

(push指令esp的值,同時將eax的值壓入指定位置(壓入記憶體))

lea :取偏移位址

3.call指令(只要函式被調動,一定會分配乙個新的棧幀,包括遞迴)(esp,eip)

esp-4,把後續位址入棧   

4.深刻理解棧幀:

問題一:不同編譯器,棧幀撤銷後,申請新的棧幀殘留值可能還在,可能初始化清理了

問題二:

5.int fun(int a,…)(不定引數問題)(函式返回值借用cpu通用暫存器(本身就具有長性)作為作為橋梁傳值,不允許改變通用暫存器裡的值(高階語言裡))

?為什麼不能給表示式賦值

答:因為表示式的值存放在通用暫存器裡,本身就具有長性,其值不可被改變

6.棧平衡(由呼叫者完成)

作業:查詢:__stdcall)

C,C ,VC 函式呼叫規則

以下內容 於網路 1 stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上 和引數的位元組數。2 c呼叫約定 即用 cdecl關鍵字說明 按從右至左的順序壓引數入棧...

c 函式呼叫規則

呼叫規則主要是指函式被呼叫的方式,常見的有 stdcall,fastcall,pascal等規則。不同的規則在引數壓入堆疊的順序是不同的,同時在有呼叫者清理壓入堆疊的引數還是由被呼叫者清理壓入堆疊的引數上也是不同的。一般來說,如果你沒有顯式的說明呼叫規則的話,編譯器會統一按照 cdecl來處理 wi...

構造函式呼叫規則研究

1 當類中沒有定義任何乙個建構函式時,c 編譯器會提供預設無參建構函式和預設拷貝建構函式 2 當類中定義了拷貝建構函式時,c 編譯器不會提供無引數建構函式 3 當類中定義了任意的非拷貝建構函式 即 當類中提供了有參建構函式或有參函式 c 編譯器不會提供無參建構函式 4 預設拷貝建構函式成員變數簡單賦...