彙編看函式呼叫過程

2021-07-25 09:26:39 字數 2117 閱讀 9200

分析下列原始碼:

#include dword _stdcall function(dword dwp1, pvoid p2)

int main()

轉彙編  vs2012

#include dword _stdcall function(dword dwp1, pvoid p2)  

00fe1401 pop edi //edi = 003efdcc

00fe1402 pop esi //esi = 00000000

00fe1403 pop ebx //ebx = 7efde000

00fe1404 mov esp,ebp //esp = ebp = 003efcf0

00fe1406 pop ebp //ebp = 003efdcc

00fe1407 ret 8//因為_stdcall 所以由被呼叫者平衡棧 +8

-----------------------------------------

int main()

00fe1449 pop edi

} 00fe144a pop esi

00fe144b pop ebx

00fe144c add esp,0c0h

00fe1452 cmp ebp,esp

00fe1454 call 00fe113b

00fe1459 mov esp,ebp

00fe145b pop ebp

00fe145c ret//因為_cdecl,所以由呼叫者平衡棧 直接ret即可

記憶體棧顯示: 位址

值說明003efc0c    

003efdcc      

push edi(edi = 003efdcc)

003efc10 

00000000

push esi(esi = 00000000)

003efc14

7efde000

push ebx(ebx = 7efde000)

003efc18

cccccccc

esp = esp - 0x0d8h(216)

003efc1c

cccccccc

003efc20

cccccccc

................

................

003efcd4

cccccccc

003efcd8

cccccccc

003efcdc

00000003

mov [ebp-14h],3

003efce0

cccccccc

003efce4

cccccccc

003efce8

00000067

mov [ebp-8],eax

//103

003efcec

cccccccc

003efcf0

003efdcc

ebp = esp = 003efcf0

003efcf4

00fe1447

003efcf8

00000064

push    64h

003efcfc

00000000

push    0

................

................

................

003efdcc

003efe1c

ebp--main()

003efdd0

00fe1989

圖形顯示:

函式呼叫過程

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

函式呼叫過程

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

函式呼叫過程

引數代入順序 引數入棧的順序是從右向左入棧的。8位元組的引數代入 push入棧的方式將引數傳遞 8位元組的引數代入 先在main函式的棧頂向上移動12位元組,然後將引數的資料拷貝到main函式棧頂開闢的記憶體。int fun1 int a,int b int main 第一步進行函式引數入棧,如圖 ...