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與彙編(NASM) (1)ASM
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- AT&T彙編之32位與64位系統呼叫
- c與c++的相互呼叫C++
- 【程式設計素質】Java編碼約定程式設計Java
- 09. C語言內嵌彙編程式碼C語言
- NEON彙編比純C程式碼快17倍!C程式
- 一段C語言和彙編的對應分析,揭示函式呼叫的本質C語言函式
- C語言轉寫成MIPS指令集彙編以及MIPS指令集彙編中函式呼叫時棧的變化C語言函式
- Python呼叫C++編寫的方法PythonC++
- c語言if語句是如何變成彙編程式碼的?C語言
- 彙編程式碼Helloworld
- lua呼叫c程式C程式
- iOS彙編入門教程(三)彙編中的 Section 與資料存取iOS
- C指標原理(7)-C內嵌彙編指標
- C指標原理(8)-C內嵌彙編指標
- C指標原理(6)-C內嵌彙編指標
- 彙編眼中的函式呼叫引數傳遞以及全域性與區域性變數與“基址”函式變數
- C程式函式呼叫&系統呼叫C程式函式
- windows搭建彙編程式IDEWindowsIDE
- STM彙編程式設計程式設計
- Google C++ 程式設計風格指南:命名約定GoC++程式設計
- C++內嵌彙編 教程1C++
- 合約的呼叫
- 交叉編譯c++給android呼叫編譯C++Android
- Python與C/C++呼叫之ctypesPythonC++
- 【混合程式設計】C/C++呼叫Fortran的DLL程式設計C++
- CatFly【彙編程式碼還原】
- 從彙編視角解析函式呼叫中的堆疊運作函式
- ARM彙編和C語言混合程式設計中陣列的陣列的操作C語言程式設計陣列
- C#/.net程式呼叫pythonC#Python
- C# 呼叫Python程式碼C#Python
- iOS彙編入門教程(二)在Xcode工程中嵌入彙編程式碼iOSXCode
- 在VS2019使用MASM編寫彙編程式ASM
- AT&T彙編之使用C庫函式函式