1. 程式人生 > >x86 子函式呼叫過程分析

x86 子函式呼叫過程分析

工作系統:深度作業系統 15.1
工作環境: gcc version 5.3.1 20160114 (Debian 5.3.1-6)
GNU gdb (Debian 7.10-1+b1) 7.10

1)c程式碼:

/**
 * Author: lxhuster
 * Abstract: 
 */

 int foo( int x)
 {
    return (x + 2);
 }

 void main()
 {
    foo(5);
 }

2)編譯C程式碼
這裡寫圖片描述

3)對應彙編程式碼:

    .file   "main.c"
main: pushl %ebp movl %esp, %ebp pushl $5 call foo addl $4, %esp nop leave ret foo: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $2, %eax popl %ebp ret

4)foo函式呼叫過程分析:
main函式通過棧傳遞引數“5”
這裡寫圖片描述

總結:通過分析函式呼叫過程,

        1)可以發現x86預設情況下使用的減滿棧的堆疊生長方案。
        2)在彙編程式碼中movl    8(%ebp), %eax之類訪問%ebp指向地址之上的操作多半是在讀取傳入引數,
                反之,讀取%ebp指向地址之下的操作就是在操作區域性變數。

疑問:恩,為什麼x86木有使用暫存器來傳遞函式呼叫引數?

推薦圖書:

1)深入理解計算機體系結構
2)老“碼”識途從機器碼到框架

相關推薦

x86 函式呼叫過程分析

工作系統:深度作業系統 15.1 工作環境: gcc version 5.3.1 20160114 (Debian 5.3.1-6) GN

ARM函式呼叫過程分析

1.  ARM的棧幀     先來看看ARM的棧幀佈局圖:          上圖描述的是ARM的棧幀佈局方式,main stack frame為呼叫函式的棧幀,func1 stack frame為當前函式(被呼叫者)的棧幀,棧底在高地址,棧向下增長。圖中FP就是棧基址,

堆疊、棧幀與函式呼叫過程分析

函式呼叫是程式設計中的重要環節,也是程式設計師應聘時常被問及的,本文就函式呼叫的過程進行分析。 一、堆和棧 首先要清楚的是程式對記憶體的使用分為以下幾個區: l         棧區(stack):由編譯器自動分配和釋放,存放函式的引數值,區域性變數的值等。操作方式類似於資料結構中的棧。 l        

x86_64架構下函式呼叫過程分析

//被分析的C程式 int test1(int a1,int b1) { int c1; c1 = a1+b1; return c1; } int test2(int a2,char b2) { int c2; c2 =

C語言函式呼叫過程的彙編分析

轉自:   http://www.cnblogs.com/xiaojianliu/articles/8733560.html   下面一段C程式: int bar(int c, int d) { int e = c + d; return e; }

C函式呼叫過程及彙編分析

C程式碼: int fun(int para) {     int a=0;     return 0; } void main() {     fun(1); } 彙編程式碼: 1:

X86架構上函式呼叫過程的堆疊

   理解呼叫棧最重要的兩點是:棧的結構,EBP暫存器的作用。首先要認識到這樣兩個事實:  1、一個函式呼叫動作可分解為:零到多個PUSH指令(用於引數入棧),一個CALL指令。CALL指令內部其實還暗含了一個將返回地址(即CALL指令下一條指令的地址)壓棧的動作。  2、幾

C++基礎知識:c 函式呼叫過程原理及函式棧幀分析

1.關於棧   首先必須明確一點也是非常重要的一點,棧是向下生長的,所謂向下生長是指從記憶體高地址->地地址的路徑延伸,那麼就很明顯了,棧有棧底和棧頂,那麼棧頂的地址要比棧底低。對x86體系的CPU而言,其中   ---> 暫存器ebp(base pointer

VC++函式呼叫過程彙編分析(基於vs2012)

本文將在VS2012環境下對函式呼叫過程的彙編程式碼進行分析。分析不到位或者存在錯誤的地方請批評指正,請與作者聯絡。 #include <iostream> #include <stack> #include <vector> #inc

x86、arm、mips架構函式呼叫例項分析

原文網址:http://nieyong.github.com/wiki_cpu/ 在看過了上面的幾節之後,在潛意識中你想記住的東西肯定很多了。這個時候,你需要靜下心來休息一下在沉澱一下。 "Now is a good point to take a break to l

x86下SylixOS引導過程分析

http eal 查看 兩個 作用 信息 文件系統格式 add head 1. 上電啟動流程 當x86電源打開後,CPU將自動進入實模式,並從地址0xFFFF0(CS:0xFFFF,IP:0x0)開始自動運行程序代碼,此地址一般是BIOS的地址。BIOS啟動後,將啟動設備的

函式呼叫函式,父函式呼叫的方法,函式重寫了,那麼最後父函式呼叫的是自己的方法,還是函式的方法。

Q:子類呼叫父類的方法,父類中某個方法所呼叫的方法,子類也重寫了,那麼最後父類中的方法呼叫的是自己的方法,還是子類的方法。 A:呼叫的是子類的方法。     看程式碼: public class Parent { public void used

Java中的方法呼叫過程分析

假設呼叫x.f(args),隱式引數x宣告為類C的一個例項物件: 1.編譯器檢視物件的宣告型別和方法名。例如,可能存在方法f(int)和方法f(String)。編譯器將會一一列舉出所有該類中名為f的方法和其超類中訪問屬性為public且名為f的方法。 2.編譯器將檢視呼叫方法時提供的引數型別

高階語言反彙編程式的函式呼叫過程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【18.7.27】函式呼叫過程的深度理解(棧幀)

函式可以大大減少我們程式的程式碼量,使程式碼寫起來更加的簡潔,使程式碼思路更加清晰。是我們程式猿在編寫程式碼時必不可少的。 那麼函式的呼叫過程就非常的重要,今天讓我們來從一個深的角度去了解一下函式的呼叫過程。 函式的呼叫過程也可以叫做棧幀 棧幀的定義是:棧幀也叫過程活動記錄,

深入理解C語言的函式呼叫過程

    本文主要從程序棧空間的層面複習一下C語言中函式呼叫的具體過程,以加深對一些基礎知識的理解。     先看一個最簡單的程式:   點選(此處)摺疊或開啟  /*test.c*/ #include <stdio.h> int foo1(

C++ 函式呼叫過程中棧的變化解析

“ 走好選擇的路,別選擇好走的路,你才能擁有真正的自己。” There you go again! I'll back you up! 記錄下函式呼叫的情況~ 函式呼叫的另一個詞語表示叫作 過程。一個過程呼叫包括將資料和控制從程式碼的一部分傳遞到另一部分。

c語言函式呼叫過程中棧的工作原理理解

差不多每個程式設計師都知道,函式呼叫過程,就是層層入棧出棧的過程。 那麼這個過程中的詳細的細節是什麼樣子的呢? 閱讀了以下幾篇文章之後,對整個過程基本理解了: C函式呼叫過程原理及函式棧幀分析 閱讀經典——《深入理解計算機系統》04 函式返回值與棧 針對自己的理解,做個記錄:

Linux 驅動 tty終端 呼叫過程分析

核心版本: 2.6.32.2 仍在修改中 2018.12.21 需進一步瞭解核心啟動過程中start_kernel以及module_init呼叫 module_init(serial8250_init); module_init(tty_init); console_init在start

【Linux深入】epoll原始碼的函式呼叫流程分析(圖)

引入 我在上一篇博文中講了epoll原始碼的剖析,你是不是看的有點懵呢,反正我是有點,接下來我就以流程圖的形式梳理一下epoll原始碼的結構。 當然,這篇博文是建立在上一篇博文的基礎上,若你還沒看過