函式呼叫過程

2021-09-25 13:10:36 字數 1055 閱讀 9689

引數代入順序:引數入棧的順序是從右向左入棧的。

<=8位元組的引數代入:push入棧的方式將引數傳遞

>8位元組的引數代入:先在main函式的棧頂向上移動12位元組,然後將引數的資料拷貝到main函式棧頂開闢的記憶體。

int fun1(int a,int b)

int main()

第一步進行函式引數入棧,如圖:

第二步進行函式棧幀的開闢

先將呼叫方的棧底位址入棧

讓ebp=esp

esp - 棧幀大小

將棧幀記憶體寫入0xcccccccc

函式棧幀開闢流程:

1、<=8位元組的返回值帶出:利用暫存器帶回,然後將暫存器的值寫入到接收返回值的變數中

2、>8位元組的返回值帶出:

引數入棧之**main棧幀上的位址

將返回值寫入到main棧幀的位址上

將位址寫入到eax暫存器

從eax暫存器中的的位址中取出值寫入到接收返回值的變數

函式棧幀的回退分為兩步,第一步是函式棧幀的回退,第二步是函式引數的清除。

先將暫存器pop

esp=ebp

pop  main棧底位址   -----》ebp

retesp+8

函式棧幀回退匯編碼如下:

_cdecl     c標準呼叫約定

_stdcall   window標準呼叫約定

_fastcall  快速呼叫約定

_thiscall  類成員方法的呼叫約定

函式呼叫過程

每乙個未執行完的函式都對應著乙個棧幀,系統為單個函式分配的那部分棧空間就叫做棧幀,棧幀儲存了函式的資訊。以下面的 為例,通過彙編 的執行過程介紹棧幀建立和銷毀的過程 include int add int x,int y int main 從main函式建立自己的棧幀開始 其他內容先忽略 初始狀態 ...

函式呼叫過程

c語言種有三種迴圈 do.while while for 初始化 條件判斷 步進 主函式 main 庫函式自定義函式函式的發明,使得變成可以以函式為單位進行模組化,叫做面向過程。軟體工程中,有 高內聚,低耦合 的要求。函式就是為了實現以上要求發明的產物。函式是面向過程的 介面 其介面包含了 引數 返...

函式呼叫過程

主要流程 呼叫前的準備 引數入棧,eip 入棧,ebp 入棧,eip跳轉 函式執行 恢復到呼叫前狀態 返回值 eax,恢復ebp,恢復 eip include intf intmain call f 0b711d6h pushl ebp movl esp,ebp subl 16,esp movl e...