[C][棧幀]詳細講解

目錄

  • 1.棧幀
    • 1.進程地址空間
    • 2.棧幀說明
  • 2.認識相關寄存器
  • 3.認識相關匯編命令
  • 4.過程理解
  • 5.棧幀總結
  • 6.補充


1.棧幀

1.進程地址空間

請添加圖片描述
.進程地址空間

2.棧幀說明

  • 調用函數,形成棧幀
  • 函數返回,釋放棧幀
  • 局部變量是存放在棧區上的
  • 棧區內存的使用習慣是
    • 先使用高地址空間,再使用低地址空間
    • 如:數組隨著下標的增長,地址是由低到高變化的

2.認識相關寄存器

  • eax:通用寄存器,保留臨時數據,常用于返回值
  • ebx:通用寄存器,保留臨時數據
  • ebp:棧底寄存器
  • esp:棧頂寄存器
  • eip:指令寄存器,保存當前指令的下一條指令的地址

3.認識相關匯編命令

  • mov:數據轉移指令
  • push:數據入棧,同時esp棧頂寄存器也要發生改變
  • pop:數據彈出至指定位置,同時esp棧頂寄存器也要發生改變
  • sub:減法命令
  • add:加法命令
  • call:函數調用,1. 壓入返回地址 2. 轉入目標函數
    • 將當前指令的下一條指令入棧(push到棧中,影響ESP)
    • 跳轉到目標函數起始地址處運行(修改EIP,到達目標函數)
  • jump:通過修改eip,轉入目標函數,進行調用
  • ret:恢復返回地址,壓入eip,類似pop eip命令

4.過程理解

  • 起步,main()也是要被調用的
    請添加圖片描述

  • main()也要形成棧幀結構
    請添加圖片描述

  • 起步
    請添加圖片描述

  • 開始調用

    • 調用call
      請添加圖片描述

    • 調用call
      請添加圖片描述

    • 整體圖解
      請添加圖片描述

  • 形成棧幀
    請添加圖片描述

  • 釋放棧幀
    請添加圖片描述

  • 釋放臨時拷貝,徹底釋放空間
    請添加圖片描述


5.棧幀總結

  • 調用函數,需要先形成臨時拷貝,形成過程是從右向左
  • 臨時空間的開辟,是在對應函數棧幀內部開辟的
  • 函數調用完畢,棧幀結構被釋放掉
  • 臨時變量具有臨時性的本質:棧幀具有臨時性
  • 調用函數是有成本的,成本體現在時間和空間上,本質是形成和釋放棧幀有成本
  • 函數調用,因拷貝所形成的臨時變量,變量和變量之間的位置關系是有規律的(地址連續)

6.補充

  • 堆上都是動態分配,做不到靜態分配
  • 棧既可以靜態分配,也可以動態分配
    • 靜態分配 – 在函數體中創建了一個變量
    • 動態分配
      • 頭文件<malloc.h>下,有一個void* __cdecl alloca(size_t)
      • 作用與malloc等類似,但是它申請的是“棧(stack)”空間的內存
      • 用完會在退出棧時自動釋放,無需手動釋放

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20731.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BPTT算法詳解:深入探究循環神經網絡(RNN)中的梯度計算【原理理解】

引言 在深度學習領域中&#xff0c;我們經常處理的是獨立同分布&#xff08;i.i.d&#xff09;的數據&#xff0c;比如圖像分類、文本生成等任務&#xff0c;其中每個樣本之間相互獨立。然而&#xff0c;在現實生活中&#xff0c;許多數據具有時序結構&#xff0c;例如語言模型…

什么是PLAB?

接上文PLAB---》 可以看到和TLAB很像&#xff0c;PLAB即 Promotion Local Allocation Buffers。用在年輕代對象晉升到老年代時。 在多線程并行執行YGC時&#xff0c;可能有很多對象需要晉升到老年代&#xff0c;此時老年代的指針就"熱"起來了&#xff0c;于是搞了個…

Google Cloudbuild yaml file 中 entrypoint 和 args 的寫法

編寫cloudbuild.yaml 時有幾個關鍵參數 entrypoint 和 args 的基本介紹 id: 顯示在 cloud build logs 里的item 名字 name: docker 鏡像名字 - 下面的命令會在這個鏡像的1個容器instance 內執行 entrypoint: 執行的命令入口 &#xff0c; 只能有1個對象 args&#xff1a; 命名…

函數的創建和調用

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 提到函數&#xff0c;大家會想到數學函數吧&#xff0c;函數是數學最重要的一個模塊&#xff0c;貫穿整個數學學習過程。在Python中&#xff0c;函數…

深入解析 YOLOv8 中的 `conv.py`(代碼圖文全解析-下)

&#x1f60e; 作者介紹&#xff1a;我是程序員行者孫&#xff0c;一個熱愛分享技術的制能工人。計算機本碩&#xff0c;人工制能研究生。公眾號&#xff1a;AI Sun&#xff0c;視頻號&#xff1a;AI-行者Sun &#x1f388; 本文專欄&#xff1a;本文收錄于《yolov8》系列專欄&…

【linux軟件基礎知識】與調度相關的進程描述符

進程描述符 每個進程描述符都包括幾個與調度相關的字段,如下代碼所示: //include/asm-arm/thread_info.h /** low level task data that entry.S needs immediate access to.* __switch_to() assumes cpu_context follows immediately after cpu_domain.*/ struct thread_in…

vite為什么速度快

原因 vite快的原因是因為 vite在開發環境中是使用的 esbuild&#xff0c;esbuild 是 go 寫的&#xff0c;go 編譯型語言、多線程&#xff0c;nodejs 解釋型語言、單線程&#xff0c;并且 vite 使用了原生 esm 導入的&#xff0c;所以快一點&#xff0c;當然&#xff0c;這也…

6.1Java方法

1、方法定義&#xff1a; 方法是一種語法結構&#xff0c;它可以把一段代碼封裝成一個功能&#xff0c;以便重復調用 方法的完整格式&#xff1a; 修飾符 返回類型 方法名(形參列表){ 方法體代碼(需要執行的功能代碼) return 返回值; } package com.define;public class …

【緩存】框架層常見問題和對策

緩存是為了加快讀寫速度&#xff0c;再了解redis這類框架層的緩存應用之前&#xff0c;我們不妨先思考下操作系統層面的緩存解決方案&#xff0c;這樣有助于我們更深的理解緩存&#xff0c;哪些是系統層面的&#xff0c;哪些是服務層面。 以下是一些常見的緩存問題及其解決方案…

面向對象編程 (OOP):深入理解繼承、多態和抽象

1. 簡介 面向對象編程 (OOP) 是一種強大的編程范式&#xff0c;它通過將程序組織成對象的集合來簡化軟件設計和開發。與傳統的程序設計方法相比&#xff0c;OOP 提供了一種更自然、更易于理解和維護的方式來構建復雜的軟件系統。OOP 的核心概念包括&#xff1a;對象、類、繼承、…

Java進階學習筆記31——日期時間

Date&#xff1a; 代表的是日期和時間。 分配Date對象并初始化它以表示自標準基準時間&#xff08;稱為紀元&#xff09;以來的指定毫秒數&#xff0c;即1970年1月1日00:00:00。 有參構造器。 package cn.ensource.d3_time;import java.util.Date;public class Test1Date {pu…

linux C/C++靜態庫制作

概念&#xff1a;程序在編譯時會把庫文件的二進制代碼鏈接到目標程序中&#xff0c;這種方式稱為靜態鏈接。 如果多個程序中用到了同一靜態庫中的函數或類&#xff0c;就會存在多份拷貝。 特點&#xff1a; 靜態庫的鏈接是在編譯時期完成的&#xff0c;執行的時候代碼加載速度…

Java—異常處理

異常的結構圖 異常知識點 異常分類&#xff1a; 按照在程序編譯階段是否被檢查&#xff0c;異常分為編譯時異常&#xff08;Checked Exception&#xff09;和運行時異常&#xff08;Unchecked Exception&#xff09;。編譯時異常是指必須進行顯式處理的異常&#xff0c;例如IOE…

【Linux】寫一個日志類

文章目錄 1. 源代碼2. 函數功能概覽3. 代碼詳細解釋3.1 頭文件和宏定義3.2 Log類定義3.3 打印日志的方法3.4 操作符重載和析構函數3.5 可變參數函數的原理 4. 測試用例 1. 源代碼 下面代碼定義了一個 Log 類&#xff0c;用于記錄日志信息。這個類支持將日志信息輸出到屏幕、單…

Java擴展機制:SPI與Spring.factories詳解

一、SPI SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現或者擴展的API,它可以用來啟用框架擴展和替換組件。 整體機制圖如下: Java SPI 實際上是“基于接口的編程+策略模式+配置文件”組合實現的動態加載機制。 系統設計的各個抽象,往往有很多不…

戴爾科技:一盆冷水澆醒了AIPC

這年頭&#xff0c;只要沾上英偉達的公司&#xff0c;不論美股還是大A,都跟著雞犬升天幾輪過&#xff0c;但昨晚英偉達蒸發1064億美元&#xff0c; 跟著遭罪的也不少&#xff0c;有沒有一夜驚魂夢醒的感覺&#xff1f; 今天我們來說說——戴爾科技。 昨晚戴爾科技大跌5.18%&a…

5G無線標準演進綜述及新技術引入

摘 要 隨著經濟和社會的發展&#xff0c;5G業務越來越豐富多彩&#xff0c;1080P高清視頻、裸眼3D、網聯汽車、云手機等新業務、新終端對網絡的要求也越來越高&#xff1b;另一方面&#xff0c;5G標準持續演進&#xff0c;在MIMO、載波聚合、移動性管理、uRLLC、切片、定位等方…

你了解MySQL分區表嗎?知道哪些情況不適用分區表嗎?

一、分區表的使用 簡單來說,分區表就是把物理表結構相同的幾張表,通過一定算法,組成一張邏輯大表。這種算法叫“分區函數”,當前 MySQL 數據庫支持的分區函數類型有 RANGE、LIST、HASH、KEY、COLUMNS。 無論選擇哪種分區函數,都要指定相關列成為分區算法的輸入條件,這些列…

ESP32開發筆記

ESP32 學習筆記 MQTT5 共享訂閱 什么是共享訂閱&#xff1f; 在普通的訂閱中&#xff0c;每發布一條消息&#xff0c;所有匹配的訂閱端都會收到該消息的副本。然而&#xff0c;當某個訂閱端的消費速度無法跟上消息的生產速度時&#xff0c;我們無法將其中一部分消息分流到…

`nano` 文本編輯器快捷鍵使用

在 nano 文本編輯器中&#xff0c;可以幫助用戶高效編輯文本&#xff0c;下面是每個快捷鍵的詳細解釋&#xff1a; 常用快捷鍵 ^G: Help - 顯示幫助信息。這里的 ^ 代表 Ctrl 鍵&#xff0c;因此 ^G 就是 Ctrl G。^O: Write Out - 保存文件。^O 即 Ctrl O&#xff0c;用于將…