C與彙編程式的約定呼叫
執行函式前(已經呼叫)(prologue):
將引數逆序壓入堆疊(這樣在使用ebp+偏移量
來訪問引數時,可以不考慮引數的數量,直接用%ebp+8(,%ebp+12...)
等訪問第1個至第N個引數)
pushl $3 # push the n parameter
pushl $2 # push the secondary parameter
pushl $1 # push the first parameter
call fun #
引數n
.
.
.
引數(3):
引數(2):
引數(1):
返回地址: <----esp
執行函式(body):
儲存原來的ebp
至堆疊中
pushl %ebp
.
引數3:
引數2:
引數1:
返回地址:
%ebp(原) <----esp
將現在的ebp
賦值為esp
movl %esp,%ebp
引數3:
引數2:
引數1:
返回地址:
%ebp(原) <----esp <----ebp
建立空間(下移esp
指標)用於儲存區域性變數
subl $8,%esp
引數3:
引數2:
引數1:
返回地址:
%ebp(原) <----ebp
|
| <----esp
返回(epilogue):
儲存返回值至eax
movl -n(%ebp), %eax
丟棄建立的空間(將esp
指標移至現ebp
)
movl %ebp, %esp
引數3:
引數2:
引數1:
返回地址:
%ebp <----ebp <----esp
|
|
彈出ebp
的舊值裝入現在ebp
中
popl %ebp
引數3:
引數2:
引數1:
返回地址: <----esp
|
|
|
ret
指令通過把返回地址從堆疊中彈出到程式計數器,從而從該函式返回
ret
相關文章
- C++ 反彙編:關於函式呼叫約定C++函式
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- x86彙編之棧與子程式呼叫
- C++程式中不同函式呼叫方式的彙編碼比較C++函式
- 從彙編角度分析C語言的過程呼叫C語言
- C與彙編(NASM) (1)ASM
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- AT&T彙編之32位與64位系統呼叫
- 高階語言反彙編程式的函式呼叫過程 (轉)函式
- 【程式設計素質】Java編碼約定程式設計Java
- C#呼叫c++編寫的dllC#C++
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- 編寫高效的C程式與C程式碼優化C程式優化
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- 【阿順】Flex編碼約定與最佳實踐Flex
- c與c++的相互呼叫C++
- 一段C語言和彙編的對應分析,揭示函式呼叫的本質C語言函式
- NEON彙編比純C程式碼快17倍!C程式
- 09. C語言內嵌彙編程式碼C語言
- [轉載]論函式呼叫約定函式
- C#程式碼與javaScript函式的相互呼叫C#JavaScript函式
- c語言if語句是如何變成彙編程式碼的?C語言
- C#呼叫匯編dllC#
- 彙編程式碼Helloworld
- C語言轉寫成MIPS指令集彙編以及MIPS指令集彙編中函式呼叫時棧的變化C語言函式
- iOS彙編入門教程(三)彙編中的 Section 與資料存取iOS
- 在c++程式中呼叫被C編譯器編譯後的函式,為什麼要使用extern “C”C++編譯函式
- Python呼叫C++編寫的方法PythonC++
- 使用Delphi呼叫C++編寫的DLLC++
- lua呼叫c程式C程式
- 彙編眼中的函式呼叫引數傳遞以及全域性與區域性變數與“基址”函式變數
- c++進階(二)函式呼叫約定及函式名稱修飾符C++函式
- C指標原理(8)-C內嵌彙編指標
- C指標原理(6)-C內嵌彙編指標
- C指標原理(7)-C內嵌彙編指標
- Google C++ 程式設計風格指南:命名約定GoC++程式設計
- STM彙編程式設計程式設計
- C++內嵌彙編 教程1C++