呼叫約定的引數傳遞順序

2021-08-25 08:01:10 字數 965 閱讀 9091

都是學習過程中做的筆記。

在程式設計的過程中,函式是必不可少的基礎之一。c語言的程式完全由函式構成,所有的**都在某乙個函式中;pascal區分函式和過程,但是本質是類似的。而對計算機硬體而言cpu只關心一條條的指令,而不是它們是什麼樣的結構組織。call和ret只是為了函式呼叫的方便而已,並不是函式存在的證據。最簡單的例子就是在木馬免殺過程中call+ret和jmp是等價的。因此一種高階語言如何實現函式呼叫並不受約束,故出現了不同的函式呼叫規則。

在windows平台上常用的函式呼叫方式有pascal方式(psscal呼叫約定),winapi方式(stdcall呼叫約定),c方式(cdedel呼叫約定)。

假設有一高階語言函式message(p1,p2,p3)

c方式(cdedel呼叫約定):

1.引數從右到左進入堆疊;

2.在函式返回後,呼叫者要負責清除堆疊,所以這種呼叫會生成較大的可執行程式。

push p3

push p2

push p1

call message

add esp,0ch ;之前壓入了3個四位元組的引數

winapi方式(stdcall呼叫約定):

1.函式從右到左進入堆疊;

2.被呼叫的函式在返回之前自行清理堆疊,所以生成的**較小。

push p3

push p2

push p1

call message

pascal方式(psscal呼叫約定):主要用於win16函式庫中,現在基本不用

1.引數從左到右進入堆疊

2.被呼叫的函式在返回前自行清理堆疊

3.不支援可變引數的函式呼叫。

push p1

push p2

push p3

call message

此外在windows核心中還有快速呼叫方式(_fastcall);在c++編譯的**中有this call方式(_thiscall)。

python中的引數傳遞順序

在呼叫是,可以通過位置傳遞給name,也可以通過關鍵字傳遞給name值,func xiaoming 或者func name xiaoming 預設值引數,假設在呼叫函式時,沒有傳遞給name值,那麼name經使用預設值,這裡的name仍然可以通過位置和關鍵字傳遞值 在函式呼叫時,那麼收集任何,沒有被...

C 函式引數的傳遞順序

c 編譯器預設使用的是 cdecl 模式,引數是通過棧傳遞的,因此是從右到左的傳參順序。int f int a,int b,int c int main 當用函式做實參時,編譯器一般會根據引數傳遞順序,先計算出函式的返回值,然後將返回值傳遞給原來的函式。函式的引數是通過棧傳遞的。因此引數從右往左入棧...

呼叫方法時引數的傳遞

呼叫方法時,傳遞給方法的變數如果是基本型別,傳入到方法中後就是該方法的區域性變數,在呼叫時會在記憶體中開闢新的空間去儲存,所以對於引數名與成員變數一致的情況下,方法中改變的變數的值是與成員變數不衝突的,也就是不會影響到成員變數,除非使用this關鍵字來指向成員變數!下面是 示例 public cla...