ARM的棧指令

来源:http://www.cnblogs.com/fanzhidongyzby/archive/2016/03/07/5250116.html
-Advertisement-
Play Games

ARM的指令系統中關於棧指令的內容比較容易引起迷惑,這是因為準確描述一個棧的特點需要兩個參數: 棧地址的增長方向 :ARM將向高地址增長的棧稱為 遞增棧 (Descendent Stack),將向低地址增長的棧稱為 遞減棧 (Acendant Stack) 棧指針的指向位置 :ARM將棧指針指向棧頂


ARM的指令系統中關於棧指令的內容比較容易引起迷惑,這是因為準確描述一個棧的特點需要兩個參數:

  • 棧地址的增長方向:ARM將向高地址增長的棧稱為遞增棧(Descendent Stack),將向低地址增長的棧稱為遞減棧(Acendant Stack)
  • 棧指針的指向位置:ARM將棧指針指向棧頂元素位置的棧稱為滿棧(Full Stack),講棧指針指向即將入棧的元素位置的棧稱為空棧(Empty Stack)

1. 棧類型

根據棧地址增長方向雨棧指針指向位置的不同,自然可以將棧分為四類:

遞增棧 遞減棧
空棧 EA棧 ED棧
滿棧 FA棧 FD棧

圖1描述了四種不同類型的棧,其中虛線部分表示即將入棧的元素。


圖1 棧類型

2. 棧指令

棧的操作指令無非兩種:入棧和出棧,由於ARM描述了四種不同類型的棧,因此對應的棧指令一共有8條。

入棧 出棧
EA棧 STMEA LDMEA
ED棧 STMED LDMED
FA棧 STMFA LDMFA
FD棧 STMFD LDMFD

這些指令具有相似的首碼:

  • STM:(STore Multiple data)表示存儲數據,即入棧
  • LDM:(LoaD Multiple data)表示載入數據,即出棧

一般情況下,可以將棧操作指令分解為兩步微指令:數據存取和棧指針移動。這兩步操作的先後順序和棧指針的移動方式由棧的類型決定。

第一步 第二步 等價指令
STMEA 寫[SP] SP增加 STMIA
LDMEA SP減少 讀[SP] LDMDB
STMED 寫[SP] SP減少 STMDA
LDMED SP增加 讀[SP] LDMIB
STMFA SP增加 寫[SP] STMIB
LDMFA 讀[SP] SP減少 LDMDA
STMFD SP減少 寫[SP] STMDB
LDMFD 讀[SP] SP增加 LDMIA

ARM中存在一組緩衝區操作指令和棧指令是一一對應的,他們完成相同的功能。這些指令含義的區別來源於對存取操作的緩衝區指針地址增長方向,以及存取操作和緩衝區指針移動的先後順序決定的。這個和前面描述的棧類型的分類原則十分相似。

指針遞增(Increase) 指針遞減(Decrease)
存取前移動指針(Before) IB DB
存取後移動指針(After) IA DA

3. 使用舉例

雖然ARM的棧類型和相關的操作指令比較繁瑣,但是實際上最常用的還是和x86指令集相同的棧類型:棧向低地址方向增長,且棧指針指向棧頂元素的位置,即ARM的FD棧。因此最常見的ARM棧指令操作是STMFD和LDMFD。

x86 ARM
入棧 PUSH STMFD/STMDB
出棧 POP LDMFD/LDMIA

例如入棧指令:

STMFD SP,{R0-R3}

實際的微指令操作為:

[SP-4]  <=  R3
[SP-8]  <=  R2
[SP-12] <=  R1
[SP-16] <=  R0

在ARM的指令系統中,遞減棧入棧操作的參數入棧順序是從右到左依次入棧,而參數的出棧順序則是從左到右的逆操作。對於遞增棧,相應的操作則全部取反。
例如出棧指令:

LDMFD SP,{R4-R7}

實際的微指令操作為:

[SP]    =>  R4
[SP+4]  =>  R5
[SP+8]  =>  R6
[SP+12] =>  R7

上述的入棧和出棧指令其實僅僅對棧做了存取操作,並未真正改變SP指針的值。正常情況下,我們希望對棧操作後能自動修改棧指針SP的值,使用如下指令可以達到該目的。

STMFD SP!,{R0-R3}

對應的微指令操作為:

[SP-4]  <=  R3
[SP-8]  <=  R2
[SP-12] <=  R1
[SP-16] <=  R0
SP      =  SP - 16

同樣的:

LDMFD SP!,{R4-R7}

對應的微指令操作為:

[SP]    =>  R4
[SP+4]  =>  R5
[SP+8]  =>  R6
[SP+12] =>  R7
SP      =  SP + 16

希望通過本文對你理解ARM的棧指令有所幫助。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...