ARM子程序和棧

微處理器中的棧由棧指針指向存儲器中的棧頂來實現,當數據項入棧時,棧
指針向上移動,當數據項出棧時,棧指針向下移動。

實現棧時需要做出兩個決定:一是當數據項進棧時是向低位地址方向向上生
長(圖a和圖b)還是向高位地址方向向下生長(圖c和圖d),另一個決定是
棧指針時指向當前位置棧頂的數據項(圖a和圖c)還是指向棧頂上的第一個
空白位置(圖b和圖d)

術語TOS表示棧頂(top of stack)指明了棧中的下一個數據項,用棧來保存子程序調用后的返回地址
在這里插入圖片描述
下圖描述了一個棧指針指向棧頂項的棧。當一個項被進棧,棧指針遞減,當
一個項出棧,棧指針遞增:
在這里插入圖片描述

用棧指針SP來定義入棧和出棧操作:

在這里插入圖片描述

注意棧指針按照4個字節遞增或遞減,因為存儲器按照字節編址,棧的數據項長為一個字(4個字節)。

子程序調用和返回

可以通過先將返回地址入棧,然后跳轉到分支目標地址處來實現子程序調用。
該操作在CISC處理器中由JSR target或BSR target指令來實現。ARM沒有實現這
一操作,需通過下述指令來實現:

	; 假設棧朝低地址方向生長且SP指向棧的下一個數據項 SUB	r13,r13,#4	; 棧指針先遞減STR	r15,[r13]	; 返回地址入棧B	Target		; 跳轉到目標地址…			; 在這里返回

一旦執行完子程序中的代碼,就會執行子程序返回指令RTS,且PC將恢復到指令BSR Proc_A被取出來之后的那個點。RTS指令的作用是:
RTS: [PC] <- [[Sp]] ; 把棧中的返回地址復制到PC
[SP] <- [SP] + 4 ; 調整棧指針

棧將向上移動4個字節,因為每個地址都是4個字節。ARM不支持基于棧的子
程序返回機制,則代碼應寫為:
LDR r12,[r13],#+4 ; 取出保存的PC,棧指針后遞增
SUB r15,r12,#4 ; 修正PC并將其加載到r15中以返回

注意:必須修改保存的PC,因為它指向實際返回地址之后4字節的位置(由于
ARM的整數流水線),然后將PC加載到r15,強制從子程序中返回。

盡管上面子程序調用的方法可以工作,但有一個更好的使用ARM塊移動指令的機制:

STMIA	   sp!,{r6,lr}	; r6與鏈接寄存器入棧
...			; 這里是子程序代碼
LDMDB   sp!,{r6,pc}	; r6出棧并取出PC,返回地址出棧,送到PC以返回

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

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

相關文章

jwt身份驗證和基本的利用方式

前言 &#xff1a; 什么是jwt&#xff08;json web token&#xff09;&#xff1f; 看看英文單詞的意思就是 json形式的token 他的基本的特征 &#xff1a; 類似于這樣的 他有2個點 分割 解碼的時候會有三個部分 頭部 payload 對稱密鑰 這個就是對稱加密 頭部&am…

n8n工作流自動化平臺的實操:利用本地嵌入模型,完成文件內容的向量化及入庫

1.成果展示 1.1n8n的工作流 牽涉節點&#xff1a;FTP、Code、Milvus Vector Store、Embeddings OpenAI、Default Data Loader、Recursive Character Text Splitter 12.向量庫的結果 2.實操過程 2.1發布本地嵌入模型服務 將bge-m3嵌入模型&#xff0c;發布成滿足open api接口…

MATLAB人工大猩猩部隊GTO優化CNN-LSTM多變量時間序列預測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄目錄&#xff0c;查看更多內容。 目錄 0 引言 1 數據準備 2 CNN-LSTM模型搭建 3 GTO超參數優化 3.1 GTO函數極值尋優 3.2 GTO優化CNN-LSTM超參數 3.3 主程序 4 結語 0 引言…

git項目遷移,包括所有的提交記錄和分支 gitlab遷移到gitblit

之前git都是全新項目上傳&#xff0c;沒有遷移過&#xff0c;因為遷移的話要考慮已有項目上的分支都要遷移過去&#xff0c;提交記錄能遷移就好&#xff1b;分支如果按照全新項目上傳的方式需要新git手動創建好老git已有分支&#xff0c;在手動一個一個克隆老項目分支代碼依次提…

Photo-SLAM論文理解、環境搭建、代碼理解與實測效果

前言&#xff1a;第一個解耦式Photo-SLAM&#xff0c;亮點和效果。 參考&#xff1a;https://zhuanlan.zhihu.com/p/715311759 全網最細PhotoSLAM的conda環境配置教程&#xff0c;拒絕環境污染&#xff01;&#xff01;-CSDN博客 1. 環境搭建 硬件&#xff1a;RTX 4090D wi…

如何使用VSCode編寫C、C++和Python程序

一、首先準備好前期工作。如下載安裝Python、VSCode、一些插件等。寫代碼之前需要先創建文件夾和文件。 二、將不同語言寫的代碼放在不同的文件夾中&#xff0c;注意命名時不要使用中文。 三、打開VSCode&#xff0c;點擊“文件”->“打開文件夾”->“daimalainxi”->…

基于不確定性感知學習的單圖像自監督3D人體網格重建 (論文筆記與思考)

文章目錄 論文解決的問題提出的算法以及啟發點 論文解決的問題 首先這是 Self-Supervised 3D Human mesh recovery from a single image with uncertainty-aware learning &#xff08;AAAI 2024&#xff09;的論文筆記。該文中主要提出了一個自監督的framework用于人體的姿態…

Leetcode刷題記錄33——二叉樹的最小深度

題源&#xff1a;https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 題目描述&#xff1a; 思路一&#xff1a; 使用 DFS 遞歸遍歷的解法&#xff0c;每當遍歷到一條樹枝的葉子節點&#xff0c;就會更新最小深度&#xff0c;當遍歷完整棵樹后&#x…

有效的括號(20)

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:bool isValid(string s) {unordered_map<char, char> m {{), (}, {],[}, {}, {}};stack<char> stk;for (int i 0; i < s.size(); i) {if (s[i] ( || s[i…

電子郵件相關協議介紹

0 Preface/Foreword 1 協議介紹 電子郵件包含的主要協議&#xff1a; SMTPPOPIMAP 1.1 SMPT SMPT: Simple Mail Transfer Protocol&#xff0c;電子郵件傳輸的標準協議&#xff0c;負責將郵件從發送方傳輸到接收方郵件服務器。 1.2 POP POP&#xff1a; Post Office Protoc…

Linux壓縮和解壓類

一、gzip/gunzip 壓縮 1、基本語法 gzip 文件 &#xff08;功能描述&#xff1a;壓縮文件&#xff0c;只能將文件壓縮為*.gz文件&#xff09; gunzip 文件.gz &#xff08;功能描述&#xff1a;解壓縮文件命令&#xff09; 2、經驗技巧 &#xff08;1&#…

力扣hot100 (除自身以外數組的乘積)

238. 除自身以外數組的乘積 中等 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除…

什么是“系統調用”

一、什么是“系統調用”&#xff1f;用生活中的比喻理解 可以把“系統調用”比作你&#xff08;用戶&#xff09;向“管理員”請求幫助完成某件事情的過程。 舉個例子&#xff1a; 你想借書&#xff0c;去圖書館&#xff08;操作系統&#xff09;找管理員&#xff08;內核&a…

三維重建(二十一)——第二步和第三步

文章目錄 一、上一篇5.3.1 train-185.3.2 test-193二、第二步:自己重新寫一個代碼,利用RTK的參數,成功的和gshell的渲染圖片一樣2.1 只能單獨一個圖片,并且需要調整輸入pose\內參問題描述可能原因2.2 批量輸出問題描述可能原因解決方案重新檢查代碼發現錯誤2.3 成功三、第三…

n8n 中 No Operation 節點說明

n8n 中 No Operation 節點說明 當"什么都不做"也是一種設計:n8n No Operation 節點深度解析一、No Operation節點是什么?二、為什么需要"空節點"?1. 流程可視化注釋2. 調試占位符3. 流程拓撲優化三、實戰應用場景場景1:審批流程占位四、設計哲學思考五…

使用 JavaScript 實現數據導出為 Excel 和 CSV 文件

在 Web 開發中&#xff0c;經常會遇到需要將數據導出為文件的需求&#xff0c;例如將數據導出為 Excel 或 CSV 文件。今天&#xff0c;我們就來探討如何使用 JavaScript 實現這一功能。 一、實現思路 我們通過 HTML 創建一個按鈕&#xff0c;點擊按鈕時&#xff0c;觸發 Java…

青聽音樂 1.0.6| 全網音樂免費聽,無損下載,4條音源,界面簡潔無廣告

一款強大的音樂播放器&#xff0c;內部集成了相當豐富的功能&#xff0c;可以一鍵搜索任何想要的歌曲或歌手專輯&#xff0c;同時還支持下載和收藏&#xff0c;擁有非常流暢的速度&#xff0c;使用起來沒有任何限制&#xff01;軟件自帶有大廠的解析音源&#xff0c;運行非常穩…

動態規劃之子序列問題1

以leetcode300題為例 此題最為經典&#xff0c;所有的算法書在講子序列問題時都以這個為模板題&#xff0c;后面的題可以按照此題的分析方法進行分析 區分子序列和子數組 例如a&#xff0c;b&#xff0c;c&#xff0c;d&#xff0c;e這個數組 子數組是必須連續的&#xff0c;…

android-ndk開發(4): linux開發機有線連接android設備

android-ndk開發(4): linux開發機有線連接android設備 2025/05/05 1. 概要 linux 系統&#xff0c; 例如最常見的 ubuntu&#xff0c; 在通過 USB 線把 android 設備連接到開發機上時&#xff0c; 僅僅是 ”物理上的連接”。 這時候 adb 是無法識別到 android 設備的。 需要…

NOI 2025 大綱更新:算法競賽的新風向標

《NOI 2025 大綱更新&#xff1a;算法競賽的新風向標》 在信息學奧林匹克競賽&#xff08;NOI&#xff09;的賽場上&#xff0c;每一次大綱的更新都如同一場風暴的前奏&#xff0c;它預示著競賽知識體系的變革&#xff0c;也引領著選手們備戰的方向。2025 年的 NOI 大綱已經正…