來一起聊聊棧幀吧!!!

2021-08-20 11:29:53 字數 1727 閱讀 2215

今天我們一起來****棧幀。那麼,首先呢,我們先想一下為什麼要討論棧幀呢?我想大家應該聽說過不少次,函式呼叫時,變數具有臨時性。

那麼這個所謂的臨時性怎麼體現出來呢?那麼心裡揣著這個疑問,由我們接下來慢慢討論!

1. 討論前的準備工作:

32位cpu通用暫存器:eax,ebx,ecx,edx,ebp,esp,esi,edi(可用於傳送和暫存資料)

ebp:指向棧幀的底部

esp:指向棧幀的頂部 

棧幀的特點:先進後出(就如同一條只有一輛車寬的車道,第一輛車從車道入口開進去就放在了最裡邊,它想出來就 必須等後面的車從車道入口出去之後才能出去)

棧幀操作:push:把乙個新值壓入到棧幀頂部,。(把車從車道入口開進去)

pop: 把乙個棧裡的值移出去。(把車從車道入口開出去)

現在我們有了初步的知識儲備,那現在就讓我們一起來捋一捋函式呼叫時的大致過程。那麼現在看看下面的函式:

#include

#include

int add(int a, int b)

int main()

上面是乙個簡單的呼叫add函式的簡單的**

2.**函式呼叫過程:

(1)想象出乙個棧空間;

(2)調出**的組合語言,根據組合語言進行行動;

經上述便利之後,我們想象中的棧幀結構圖大致為:

此時函式即將開始呼叫:

此時棧幀空間裡已經形成了形參例項化的a和b:      

之後跳轉至add函式:

此時的add函式的棧幀就開闢出來,並且對a和b做了一些列的運算操作:

現在就是函式返回的過程:

此時ebp已經指回main函式的棧底:

此時,可以看看esp,ebp,各自的指向(注意這個函式中說的加多少都是加其型別的大小):

3:總結:

(1)函式呼叫時會形成棧幀結構;

(2)在函式呼叫完畢之後資料就失效了(注意不是清零),這也就是臨時性的體現;

(3)棧幀的結構是自上向下的走向;

不說了,打**去了(別問**是誰)!!!!!

一起來玩了下 InfluxDb 吧

我比較懶,能用簡單的辦法搞定,就不喜歡習慣用開源的東西,因為覺得自己學習的也比較慢,但是不得不說這種快速上手乙個陌生產品的能力很重要,我很缺乏這種能力。我們提供乙個長連線服務,占用埠8080,我最初的方式通過 shell 指令碼做乙個簡單的監控,資料都直接寫在了日誌檔案裡。while dosleep...

一起學習程式設計吧

第一次寫部落格 我的程式設計之路 學習程式設計是個堅持而又長遠的路,合適的方法和習慣將讓你走的更平坦,下面就談談我的感想吧!1.目標 不管做什麼都會事先定乙個目標,程式設計也是得有自己的目標,比如以後想幹什麼,具體做什麼,想學哪門語言,程式語言有多種,不在乎多在於精,計算機語言都是相通的,精通一門語...

我們來聊聊物件導向吧 一

前言 什麼是物件導向,對於初學者其實就是個噩夢,但是其實物件導向,也不可怕,我個人理解是 變數把具有一定作用的資料存起來,以便後面使用,而函式則是將經常使用的功能封裝起來以便後面使用,而物件導向的思想其實把擁有重複使用的變數和函式組裝起來的一種思想,分隔成一小塊塊的 以便管理和日後的維護.繼承 子類...