Linux-C-函數棧-SP寄存器

?sp(Stack Pointer,棧指針)是計算機體系結構中一個非常重要的寄存器,下面將詳細介紹其作用和原理

作用

1. 管理棧內存

棧是一種后進先出(LIFO,Last In First Out)的數據結構,在程序運行過程中,棧用于存儲局部變量、函數調用的上下文信息(如返回地址、寄存器值等)。sp?寄存器的主要作用就是指向棧頂的位置,通過移動?sp?指針,可以在棧上進行數據的壓入(PUSH)和彈出(POP)操作。

2. 支持函數調用

當程序調用一個函數時,需要保存當前的執行上下文(如返回地址、寄存器的值等),以便在函數執行完畢后能夠正確返回并恢復現場。這些信息通常會被壓入棧中,sp?指針會相應地移動來指示棧頂的新位置。在函數返回時,再從棧中彈出這些信息,sp?指針也會恢復到調用函數之前的位置。

3. 存儲局部變量

函數內部定義的局部變量通常也存儲在棧上。在函數執行過程中,sp?指針會根據局部變量的大小進行調整,為局部變量分配棧空間。當函數執行完畢后,sp?指針會恢復到原來的位置,釋放這些局部變量所占用的棧空間。

原理

1. 棧的生長方向

棧的生長方向在不同的體系結構中可能有所不同,常見的有兩種:向下生長(向低地址方向)和向上生長(向高地址方向)。

  • 向下生長:大多數現代計算機體系結構(如 ARM、x86 等)采用向下生長的棧。在這種情況下,棧底位于較高的地址,棧頂位于較低的地址。當向棧中壓入數據時,sp?指針的值會減小;當從棧中彈出數據時,sp?指針的值會增大。

  • 向上生長:少數體系結構采用向上生長的棧,棧底位于較低的地址,棧頂位于較高的地址。此時,壓入數據時?sp?指針的值會增大,彈出數據時?sp?指針的值會減小。

2. 壓棧和出棧操作

以向下生長的棧為例,介紹壓棧和出棧操作的原理。

  • 壓棧操作(PUSH):當需要將數據壓入棧中時,首先將?sp?指針的值減去數據的大小,然后將數據存儲到?sp?指針所指向的內存地址。例如,在 ARM 匯編中,使用?PUSH?指令將寄存器的值壓入棧中:

?PUSH {r0, r1} ; 將寄存器 r0 和 r1 的值壓入棧中

執行該指令時,sp?指針會自動減去 8(假設每個寄存器為 4 字節),然后將?r0?和?r1?的值依次存儲到?sp?指針所指向的內存地址。?

  • 出棧操作(POP):當需要從棧中彈出數據時,首先將?sp?指針所指向的內存地址中的數據讀取到目標寄存器中,然后將?sp?指針的值加上數據的大小。例如,在 ARM 匯編中,使用?POP?指令從棧中彈出數據:
POP {r0, r1}  ; 從棧中彈出數據到寄存器 r0 和 r1

執行該指令時,首先將?sp?指針所指向的內存地址中的數據讀取到?r0?中,然后將?sp?指針的值加上 4,再將新的?sp?指針所指向的內存地址中的數據讀取到?r1?中,最后?sp?指針的值再加上 4。?

3. 函數調用和返回過程

函數調用和返回過程涉及到棧指針的一系列操作,以確保程序能夠正確執行。

  • 函數調用:當程序調用一個函數時,通常會執行以下步驟:

    1. 將返回地址壓入棧中,以便函數執行完畢后能夠返回到調用點。
    2. 保存當前的寄存器值(如果需要)到棧中。
    3. 調整?sp?指針,為函數的局部變量分配棧空間。
    4. 跳轉到被調用函數的入口地址開始執行。
  • 函數返回:當函數執行完畢后,會執行以下步驟:

    1. 恢復之前保存的寄存器值(如果有)。
    2. 從棧中彈出返回地址。
    3. 調整?sp?指針,釋放函數的局部變量所占用的棧空間。
    4. 跳轉到返回地址繼續執行。
  • 示例代碼(ARM 匯編)

    ?
        .global mainmain:; 保存返回地址和寄存器值PUSH {lr}; 為局部變量分配棧空間SUB sp, sp, #4; 假設局部變量賦值MOV r0, #10STR r0, [sp]; 恢復棧空間ADD sp, sp, #4; 恢復返回地址并返回POP {pc}
    
    ?

    在這個示例中,PUSH {lr}?將返回地址壓入棧中,SUB sp, sp, #4?為局部變量分配 4 字節的棧空間,ADD sp, sp, #4?釋放局部變量所占用的棧空間,POP {pc}?從棧中彈出返回地址并跳轉到該地址繼續執行。

  • sp?寄存器是管理棧內存的關鍵,通過移動?sp?指針可以實現數據的壓棧和出棧操作,支持函數調用和局部變量的存儲。理解?sp?指針的作用和原理對于深入理解程序的執行過程和內存管理非常重要。

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

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

相關文章

從零開始用react + tailwindcs + express + mongodb實現一個聊天程序(一)

項目包含5個模塊 1.首頁 (聊天主頁) 2.注冊 3.登錄 4.個人資料 5.設置主題 一、配置開發環境 建立項目文件夾 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 創建前端項目時我們選擇javascrip…

深入理解 QObject的作用

QObject 作為 Qt 庫中所有對象的基類,其地位無可替代。幾乎 Qt 框架內的每一個類,無論是負責構建用戶界面的 QWidget,還是專注于數據處理與呈現的 QAbstractItemModel,均直接或間接繼承自 QObject。這種繼承體系賦予 Qt 類庫高度的…

22爬蟲:使用Drission Page的兩個案例

案例一:使用DrissionPage抓取BOSS上的招聘信息 使用requests獲取BOSS網站上的內容是非常困難的,但是通過網頁自動化工具DrissionPage或者是Playwright或者是Seleenium是非常容易的,接下來我們就給出使用DrissionPage爬取BOSS網站python招聘的…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_atoi 函數

ngx_atoi 聲明在 src/core/ngx_string.h ngx_int_t ngx_atoi(u_char *line, size_t n); 定義在 src/core/ngx_string.c ngx_int_t ngx_atoi(u_char *line, size_t n) {ngx_int_t value, cutoff, cutlim;if (n 0) {return NGX_ERROR;}cutoff NGX_MAX_INT_T_VALUE / 10;cutlim…

具有整合各亞專科醫學領域知識能力的AI智能體開發綱要(2025版)

整合各亞專科醫學領域知識能力的AI代理的開發與研究 一、引言 1.1 研究背景 在科技飛速發展的當下,人工智能(AI)已成為推動各行業變革的關鍵力量,醫療領域也不例外。近年來,AI 在醫療行業的應用取得了顯著進展,從醫學影像診斷到疾病預測,從藥物研發到個性化醫療,AI 技…

如何設計app測試用例

功能測試 測試方法:等價類劃分法、邊界值法、場景法、因果圖法。優先級設定:核心業務功能設為高優先級。需求覆蓋 正向場景、反向場景、關聯接口串場景 與后端開發確認測試用例是否全面覆蓋后端邏輯。和產品確認用例是否覆蓋本次需求,以及是否…

YOLO11 【四】 【DNF制作自己的數據集,切割視頻以及labelimg 閃退問題】

一、問題labelimg 閃退 一點w打標 labelimg就閃退 **原因 : python 版本太高 ** 解決辦法:單獨創建一個虛擬環境用于打標 conda create -n labelimg python3.9 二、使用python腳本切割視頻 # -*- coding: utf-8 -*- import cv2 import osdef video_…

[MDM 2024]Spatial-Temporal Large Language Model for Traffic Prediction

論文網址:[2401.10134] Spatial-Temporal Large Language Model for Traffic Prediction 論文代碼:GitHub - ChenxiLiu-HNU/ST-LLM: Official implementation of the paper "Spatial-Temporal Large Language Model for Traffic Prediction" …

k2路由器登錄校園網

教程1刷入Breed,并手動刷入Padavan固件:斐訊K1、K2、K2P 刷機、刷入Breed 輔助工具 | tb (tbvv.net) Padavan下載網址: 我用的是: Padavan 登錄的網址是 192.168.123.1 Padavan配置教程: 先用網線連上校園網&#…

多源 BFS 算法詳解:從原理到實現,高效解決多源最短路問題

多源 BFS 是一種解決 邊權為 1 的多源最短路問題 的高效算法。其核心思想是將所有源點視為一個“超級源點”,通過一次 BFS 遍歷即可計算所有節點到最近源點的最短距離。以下從原理、實現和代碼示例三個方面深入講解: 目錄 一、原理分析 1. 單源 BFS vs…

【藍橋杯集訓·每日一題2025】 AcWing 6123. 哞叫時間 python

6123. 哞叫時間 Week 1 2月18日 農夫約翰正在試圖向埃爾茜描述他最喜歡的 USACO 競賽,但她很難理解為什么他這么喜歡它。 他說「競賽中我最喜歡的部分是貝茜說 『現在是哞哞時間』并在整個競賽中一直哞哞叫」。 埃爾茜仍然不理解,所以農夫約翰將競賽以…

C++,設計模式,【工廠方法模式】

文章目錄 如何用汽車生產線理解工廠方法模式?一、傳統生產方式的困境二、工廠方法模式解決方案三、模式應用場景四、模式優勢分析五、現實應用啟示?C++,設計模式,【目錄篇】 如何用汽車生產線理解工廠方法模式? 某個早晨,某車企CEO看著會議室里堆積如面的新車訂單皺起眉…

貪心算法

int a[1000], b5, c8; swap(b, c); // 交換操作 memset(a, 0, sizeof(a)); // 初始化為0或-1 引導問題 為一個小老鼠準備了M磅的貓糧,準備去和看守倉庫的貓做交易,因為倉庫里有小老鼠喜歡吃的五香豆,第i個房間有J[i] 磅的五香豆&#xf…

機器學習·數據處理

前言 對于大規模數據,我們經常會使用python內置函數或者編寫腳本進行批量化處理,從而提高后續使用算法的效率。 1. 正則表達式 定義:用于檢索、替換符合某個模式的文本,是文本預處理常用技術。基本語法 符號描述.匹配除換行符 …

大廠出品!三個新的 DeepSeek 平替網站

前幾天給大家分享了幾個 DeepSeek 免費平替網站,今天又來更新啦。 新增了以下三個平臺:火山引擎、知乎直達、百度搜索。 經過實際測試,這幾個平臺的服務響應速度快,穩定性表現優異,基本不會出現宕機或服務器繁忙的情…

[創業之路-321]:創新開拓思維和經營管理思維的比較

目錄 一、概述 1.1、定義與內涵 1、創新開拓思維: 2、經營管理思維: 1.2、特點與優勢 1、創新開拓思維的特點與優勢: 2、經營管理思維的特點與優勢: 3、應用場景與限制 4、總結 二、創新開拓思維與經營管理思維&#xf…

《深度學習實戰》第1集:深度學習基礎回顧與框架選擇

本專欄系列博文旨在幫助讀者從深度學習的基礎知識逐步進階到前沿技術,涵蓋理論、實戰和行業應用。每集聚焦一個核心知識點,并結合實際項目進行實踐,避免空談理論,簡潔明快,快速切入代碼,所有代碼都經過驗證…

經典復古嘻哈說唱朋克風格專輯海報標題設計psai英文字體安裝包 Punk Of Sad — Ransom Font

Punk Of Sad 將確保您忘記所有簡潔的線條和企業潤色。這種經典的贖金風格字體是一封寫給 DIY 文化的情書,誕生于雜志、演出海報和地下場景的原始能量的剪切和粘貼混亂。每個字母都是不可預測的,都帶有叛逆的邊緣。 這種字體有三種不同的樣式 – Regular…

hot100-滑動窗口

3. 無重復字符的最長子串 給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串的長度。 思路:雙指針指向不含重復字符的連續字串的頭和尾,用集合存儲子串中的元素,有重復時,左指針持續右移,無重復后…

MariaDB 歷史版本下載地址 —— 筑夢之路

MariaDB 官方yum源里面只有目前在維護的版本,而有時候對于老項目來說還是需要老版本的rpm包,國內很多鏡像站都是同步的官方倉庫,因此下載老版本也不好找,這里主要記錄下從哪里可以下載到歷史版本的MariaDB rpm包。 1. 官方歸檔網…