1. 程式人生 > >CSAPP:函式呼叫過程(ebp,esp)

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:函式呼叫過程ebpesp

#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++程式碼反彙編後的函式呼叫過程堆疊暫存器EBPESP

棧是從高地址向低地址生長的。  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 打包並呼叫dllopencv函式複雜情況下

首先,先推薦兩個具有高質量的部落格,先把這兩個案例做成功了,我這邊的案例也差不多了。 博主認為使用函式進行打包的方法更加簡單。為避免前兩個博主的文章消

函式呼叫過程函式引數的入棧順序

      函式呼叫過程中,第一個進棧的是(主函式中的)呼叫處的下一條指令(即函式呼叫語句的下一條可執行語句)的地址;然後是函式的各個引數,而在大多數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基礎--函式3allany

測試程式碼: #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就是棧基址,