CSAPP:函式呼叫過程(ebp,esp)
#include <stdio.h>
int func(int param1 ,int param2,int param3)
{
int var1 = param1;
int var2 = param2;
int var3 = param3;
printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);
return var1;
}
int main(int argc, char* argv[])
{
int result = func(1,2 ,3);
return 0;
}
首先說明,在堆疊中變數分佈是從高地址到低地址分佈,EBP是指向棧底的指標,在過程呼叫中不變,又稱為幀指標。ESP指向棧頂,程式執行時移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指標。
下面來逐步分析函式的呼叫過程
1.函式main執行,main各個引數從右向左逐步壓入棧中,最後壓入返回地址
2.執行第15行,3個引數以從右向左的順序壓入堆疊,即從param3到param1,棧內分佈如下圖:
3.然後是返回地址入棧:此時的棧內分佈如下:
4.第3行函式呼叫時,通過跳轉指令進入函式後,函式地址入棧後,EBP入棧,然後把當前ESP的值給EBP,對應的彙編指令:
push ebp
mov ebp esp
此時棧頂和棧底指向同一位置,棧內分佈如下:
5.第5行開始執行, int var1 = param1; int var2 = param2; int var3 = param3;按申明順序依次儲存。對應的彙編:
mov 0x8(%ebp),%eax
mov %eax,-0x4(%ebp)
其中將[EBP+0x8]地址裡的內容賦給EAX,即把param的值賦給EAX,然後把EAX的中的值放到[EBP-4]這個地址裡,即把EAX值賦給var1,完成C程式碼 int var1 = param1,其他變數雷同。
6.第9行,輸出結果,第10行執行 對應的彙編程式碼:
mov -0x4(%ebp),%eax
最後通過eax暫存器儲存函式的返回值;
7.呼叫執行函式完畢,區域性變數var3,var2,var1一次出棧,EBP恢復原值,返回地址出棧,找到原執行地址,param1,param2,param3依次出棧,函式呼叫執行完畢
相關推薦
CSAPP:函式呼叫過程(ebp,esp)
#include <stdio.h> int func(int param1 ,int param2,int param3) { int var1 = param1; int var2 = param2;
函式的呼叫過程(棧幀結構)—C語言版
主要從三個方面來詳解棧幀1. 在c語言中關於函式呼叫過程,用棧幀來分析 2. 可以通過棧幀來修改函式返回時的地址3. 讓不能正常返回的函式可以返回----------測試環境 VS2008 win10----------1.函式的呼叫過程 棧幀分析(棧幀在C語言中是指每一個
函式呼叫過程(棧幀)
函式呼叫過程詳解原始碼#include<stdio.h> int add(int x,int y) { int c=x+y; return c; } int main() { int a=0xaaaaaaaa; int b=0xbbbbbbbb; in
C++程式碼反彙編後的函式呼叫過程,堆疊暫存器EBP和ESP
棧是從高地址向低地址生長的。 ebp始終指向當前棧幀的棧底部 , 通過ebp+4中儲存著函式的返回地址 。函式返回時將EBP的值推給EIP ,返回到上一個函幀繼續執行。 ret 與call指令 相反 ,call 將EIP壓入堆疊,然後跳到標號處。 ret 8 在函式返回
《Oracle PL/SQL開發指南》學習筆記31——原始碼除錯——函式和過程(第一部分,函式呼叫表示法)
這節很基礎,卻發現了Oracle的可愛之處,一個函式呼叫就提供了這麼多選項,學起來真夠累的! 1. 在PL/SQL中呼叫函式表示法 SQL> /* Formatted on 2018/12/4 0:08:00 (QP5 v5.256.13226.355
《Oracle PL/SQL開發指南》學習筆記31——原始碼除錯——函式和過程(第四部分,物件表函式,result_cache子句)
建立一個物件表函式有三個步驟: 1. 定義記錄結構為物件型別 2. 定義集合 3. 定義一個函式來展示如何從PL/SQL上下文向SQL上下文返回集合 1. 建立基本的SQL使用者自定義型別(UDT) 注意:發現竟然不能使用distinct關
《Oracle PL/SQL開發指南》學習筆記31——原始碼除錯——函式和過程(第三部分,並行查詢及管道函式)
1. PARALLEL_ENABLE子句(啟用並行查詢以提高效能) 首次接觸,學習一下: PARALLEL_ENABLE lets you designate a function to support parallel query capabilities. This
《Oracle PL/SQL開發指南》學習筆記31——原始碼除錯——函式和過程(第二部分,函式)
1. 命名塊函式原型 [{EDITIONALBE | NONEDITIONALBE}] FUNCTION function_name ( parameter [IN][OUT] [NOCOPY] sql_datatype | plsql_datatype [, parame
vs2013 打包並呼叫dll(opencv,多函式複雜情況下)
首先,先推薦兩個具有高質量的部落格,先把這兩個案例做成功了,我這邊的案例也差不多了。 博主認為使用函式進行打包的方法更加簡單。為避免前兩個博主的文章消
函式呼叫過程中,函式引數的入棧順序
函式呼叫過程中,第一個進棧的是(主函式中的)呼叫處的下一條指令(即函式呼叫語句的下一條可執行語句)的地址;然後是函式的各個引數,而在大多數C/C++編譯器中,在函式呼叫的過程中,函式的引數是由右向左入棧的;然後是函式內部的區域性變數(注意static變數是不入
VC++函式呼叫過程彙編分析(基於vs2012)
本文將在VS2012環境下對函式呼叫過程的彙編程式碼進行分析。分析不到位或者存在錯誤的地方請批評指正,請與作者聯絡。 #include <iostream> #include <stack> #include <vector> #inc
dispatchTouchEvent,onUserInteraction,onTouchEvent 呼叫時序(按鍵監聽函式呼叫過程)
一、只有一個Activity時:一次拇指點選事件(包括ACTION_DOWN,ACTION_UP),呼叫時序如下: dispatchTouchEvent onUserInteraction onTouchEvent (ACTION_DOWN) dispatchTo
高階語言反彙編程式的函式呼叫過程
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【18.7.27】函式呼叫過程的深度理解(棧幀)
函式可以大大減少我們程式的程式碼量,使程式碼寫起來更加的簡潔,使程式碼思路更加清晰。是我們程式猿在編寫程式碼時必不可少的。 那麼函式的呼叫過程就非常的重要,今天讓我們來從一個深的角度去了解一下函式的呼叫過程。 函式的呼叫過程也可以叫做棧幀 棧幀的定義是:棧幀也叫過程活動記錄,
模擬RSA雙向驗證,並且實現DES加密以及MD5校驗過程(python程式碼實現)
要求如下: (1)A,B兩端各生成公鑰金鑰對(PA,SA), 金鑰對(PB,SB)。 (2)A端生成隨機數N1,用B的公鑰PB加
深入理解C語言的函式呼叫過程
本文主要從程序棧空間的層面複習一下C語言中函式呼叫的具體過程,以加深對一些基礎知識的理解。 先看一個最簡單的程式: 點選(此處)摺疊或開啟 /*test.c*/ #include <stdio.h> int foo1(
C語言函式呼叫過程的彙編分析
轉自: http://www.cnblogs.com/xiaojianliu/articles/8733560.html 下面一段C程式: int bar(int c, int d) { int e = c + d; return e; }
C++ 函式呼叫過程中棧的變化解析
“ 走好選擇的路,別選擇好走的路,你才能擁有真正的自己。” There you go again! I'll back you up! 記錄下函式呼叫的情況~ 函式呼叫的另一個詞語表示叫作 過程。一個過程呼叫包括將資料和控制從程式碼的一部分傳遞到另一部分。
python基礎--函式3(all,any)
測試程式碼: #all,any >>> slist=['c','java'] >>> all(slist) True >>> slist2=[] >>> all(slist2) True >&g
ARM函式呼叫過程分析
1. ARM的棧幀 先來看看ARM的棧幀佈局圖: 上圖描述的是ARM的棧幀佈局方式,main stack frame為呼叫函式的棧幀,func1 stack frame為當前函式(被呼叫者)的棧幀,棧底在高地址,棧向下增長。圖中FP就是棧基址,