指令系統2(Load/Store 指令)

一. Load/Store 指令

1. 前變址

前變址指令是在讀取或存儲數據時,先根據基址寄存器(Rn)與偏移量(offset)計算出有效地址,再進行數據操作。相關指令及示例如下:

  • LDR R0, [R1, #4]:從地址R1 + 4處讀取一個字(32 位)到R0。假設R1 = 0x10000000,指令執行后R0 = 0x88776655R1的值保持為0x10000000?。

  • LDRB R2, [R1, #4]:從地址R1 + 4處讀取一個字節(8 位)到R2,高位補零擴展為 32 位。執行后R2 = 0x00000055R1的值不變。

  • LDRH R3, [R1, #4]:從地址R1 + 4處讀取一個半字(16 位)到R3,高位補零擴展為 32 位。執行后R3 = 0x00006655R1的值不變。

  • LDRSB R4, [R1, #7]:從地址R1 + 7處讀取一個字節,執行符號擴展成 32 位后存入R4。執行后R4 = 0xFFFFFFFF88R1的值不變。

前變址指令詳細說明如下:

指令

功能描述

LDRB Rd, [Rn, offset]

從地址Rn + offset處讀取一個字節到Rd

LDRH Rd, [Rn, offset]

從地址Rn + offset處讀取一個半字到Rd

LDR Rd, [Rn, offset]

從地址Rn + offset處讀取一個字到Rd

LDRD Rd1, Rd2, [Rn, offset]

從地址Rn + offset處讀取一個雙字(64 位整數)到Rd1(低 32 位)和Rd2(高 32 位)中

STRB Rd, [Rn, offset]

Rd中的低字節存儲到地址Rn + offset

STRH Rd, [Rn, offset]

Rd中的低半字存儲到地址Rn + offset

STR Rd, [Rn, offset]

Rd中的低字存儲到地址Rn + offset

STRD Rd1, Rd2, [Rn, offset]

Rd1(低 32 位)和Rd2(高 32 位)表達的雙字存儲到地址Rn + offset

LDRSB Rd, [Rn, offset]
LDRSH Rd, [Rn, offset]

字節 / 半字的自動變址加載,并且在加載后執行符號擴展成 32 位

2.自動變址

自動變址指令在完成數據操作后,會自動對基址寄存器進行調整。

以? ?LDR.W R0, [R1, #20]!??為例,執行步驟如下:

  • 先計算R1 = R1 + 20?。

  • 然后將計算后的地址R1中的數據讀取到R0?。

自動變址指令詳細說明如下:

指令

功能描述

LDR.W Rd, [Rn, offset]!
LDRB.W Rd, [Rn, offset]!
LDRH.W Rd, [Rn, offset]!
LDRD.W Rd1, Rd2, [Rn, offset]!

字 / 字節 / 半字 / 雙字的自動變址加載(不做帶符號擴展,沒有用到的高位全部置 0)

LDRSB.W Rd, [Rn, offset]!
LDRSH.W Rd, [Rn, offset]!

字節 / 半字的自動變址加載,并且在加載后執行符號擴展成 32 位整數

STR.W Rd, [Rn, offset]!
STRB.W Rd, [Rn, offset]!
STRH.W Rd, [Rn, offset]!
STRD.W Rd1, Rd2, [Rn, offset]!

字 / 字節 / 半字 / 雙字的自動變址存儲

3.后變址

后變址指令先以基址寄存器(Rn)的當前值進行數據操作,然后再對基址寄存器進行調整。

STR.W R0, [R1], #-12為例,執行步驟如下:

  • 先將R0的數據存儲到地址R1處。

  • 然后計算R1 = R1 + (-12)?。

后變址指令詳細說明如下:

指令

功能描述

LDR.W Rd, [Rn], offset
LDRB.W Rd, [Rn], offset
LDRH.W Rd, [Rn], offset
LDRD.W Rd1, Rd2, [Rn], offset

字 / 字節 / 半字 / 雙字的帶后索引加載(不做帶符號擴展,沒有用到的高位全清 0)

LDRSB.W Rd, [Rn], offset

字節 / 半字的帶后索引加載,并且在加載后執行符號擴展成 32 位整數

STR.W Rd, [Rn], offset
STRB.W Rd, [Rn], offset
STRH.W Rd, [Rn], offset
STRD.W Rd1, Rd2, [Rn], offset

字 / 字節 / 半字 / 雙字的帶后索引存儲

后變址應用舉例:

  • LDR R0, [R1], #4:假設R1 = 0x10000000,先從地址R1(即0x10000000)處讀取一個字到R0R0 = 0x44332211,然后R1 = R1 + 4 = 0x10000004?。

  • LDRB R2, [R1], #4:從地址R1(此時R1 = 0x10000004)處讀取一個字節到R2R2 = 0x00000011,接著R1 = R1 + 4 = 0x10000004?。

  • LDRH R3, [R1], #4:從地址R10x10000004)處讀取一個半字到R3R3 = 0x00002211,之后R1 = R1 + 4 = 0x10000004?。

  • LDRSB R4, [R1], #7:從地址R10x10000004)處讀取一個字節并符號擴展到 32 位存入R4R4 = 0x00000011,最后R1 = R1 + 7 = 0x10000007?。

Load/Store 指令綜合舉例(字序調整):


假設內存地址0x1000處存儲的值為0x12345678ABCDEF00,執行以下指令:

  • LDR R2, =0x1000:將地址0x1000加載到R2?。

  • LDRD.W R0, R1, [R2]:從地址R2(即0x1000)處讀取一個雙字,R0 = 0xABCDEF00R1 = 0x12345678?。

  • STRD.W R1, R0, [R2]:把R1(低 32 位)和R0(高 32 位)存儲到地址R20x1000)處,此時(0x1000) = 0xABCDEF0012345678?。

二. 批量數據傳送指令

1.?批量數據 Load/Store 指令

這些指令用于在內存與多個寄存器之間批量傳輸數據,Rd后面的!表示在每次訪問前(Before)或訪問后(After),要自增(Increment)或自減(Decrement)基址寄存器Rd的值,增 / 減單位為 1 個字(4 字節)。具體指令如下:

指令

功能描述

LDMIA Rd!, {寄存器列表}

Rd處讀取多個字,每讀一個字后Rd自增一次,16 位寬度

STMIAR Rd, {寄存器列表}

存儲多個字到Rd處,每存一個字后Rd自增一次,16 位寬度

LDMIA.W Rd!, {寄存器列表}

Rd處讀取多個字,每讀一個字后Rd自增一次,32 位寬度

LDMDB.W Rd!, {寄存器列表}

Rd處讀取多個字,每讀一個字前Rd自減一次,32 位寬度

STMIA.W Rd!, {寄存器列表}

存儲多個字到Rd處,每存一個字后Rd自增一次,32 位寬度

STMDB.W Rd!, {寄存器列表}

存儲多個字到Rd處,每存一個字前Rd自減一次,32 位寬度

例如,當R8 = 0x8000時:

  • STMIA.W R8!, {R0 - R3}:每存儲一次,R8的值增加 4 字節,先存儲R0 - R3的值,然后R8自增。執行后R8值變為0x8010?。

  • STMDB.W R8!, {R0 - R3}:每存儲一次,R8的值減少 4 字節,先自減R8,然后存儲R0 - R3的值。執行后R8值變為0x7FF0?。

2.堆棧傳送類指令

  • STMDB SP!, [R0 - R3, LR]:等效于PUSH {R0 - R3, LR},將寄存器R0 - R3和鏈接寄存器LR的值壓入堆棧,堆棧指針SP在存儲前遞減。

  • LDMIIA SP!, {R0 - R3, PC}:等效于POP {R0 - R3, PC},從堆棧中彈出數據到寄存器R0 - R3和程序計數器PC,堆棧指針SP在讀取后遞增。

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

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

相關文章

ubuntu部署運行xinference全精度對話deepseek本地部署圖文教程

前置環境搭建勞請移步往期 source activate 自己環境名啟動python3.12環境安裝xinference, 按教程敲命令,wheel包與wsl的通用,pip install 包名。 vllm引擎,transform引擎也會順帶自動裝上了。 后續操作請參照往期教程。本地部署模…

技術分享 | MySQL內存使用率高問題排查

本文為墨天輪數據庫管理服務團隊第51期技術分享,內容原創,如需轉載請聯系小墨(VX:modb666)并注明來源。 一、問題現象 問題實例mysql進程實際內存使用率過高 二、問題排查 2.1 參數檢查 mysql版本 :8.0.…

[AI速讀]混合語言IP集成:挑戰與高效解決方案

在現代SoC(系統級芯片)設計中,IP(知識產權模塊)復用是提升開發效率的關鍵。然而,當設計涉及多種硬件描述語言(如SystemVerilog、VHDL、SystemC)時,如何高效集成不同語言的IP模塊成為一大難題。本文將從實際設計場景出發,探討混合語言IP集成的核心挑戰,并介紹一套方法…

【vulhub/wordpress靶場】------獲取webshell

1.進入靶場環境: 輸入:cd / vulhub / wordpress / pwnscriptum 修改版本號: vim docker-compose.yml version: 3 保存退出 開啟靶場環境: docker - compose up - d 開啟成功,docker ps查看端口 靶場環境80…

微信小程序:用戶拒絕小程序獲取當前位置后的處理辦法

【1】問題描述: 小程序在調用 wx.getLocation() 獲取用地理位置時,如果用戶選擇拒絕授權,代碼會直接拋出錯誤。如果再次調用 wx.getLocation() 時,就不會在彈窗詢問用戶是否允許授權。導致用戶想要重新允許獲取地理位置時&#x…

NLP 與常見的nlp應用

自然語言處理(NLP)是一個廣泛的領域,它不僅包括自然語言理解(NLU),還涉及一系列其他任務和子領域。以下是NLP領域中的主要組成部分及其相關任務: 1. 自然語言理解(NLU) …

全網首創/純Qt/C++實現國標GB28181服務/實時視頻/云臺控制/預置位/錄像回放和下載/事件訂閱/語音對講

一、前言說明 用純Qt來實現這個GB28181的想法很久了,具體可以追溯到2014年,一晃十年都過去了,總算是整體的框架和邏輯都打通了,總歸還是雜七雜八的事情多,無法靜下心來研究具體的協議,最開始初步了解協議后…

Django+celery+flower

Djangoceleryflower Django的定時任務及可視化監控Django Django的定時任務及可視化監控 Django的定時任務,以及可視化監控。 Django Django; 首先在python中新建虛擬環境并激活 pip install virtualenv python -m venv venv source venv/bin/activa…

Python 編程題 第十一節:選擇排序、插入排序、刪除字符、目標移動、尾部的0

選擇排序 假定第一個為最小的為已排序序列,與后面的比較,找到未排序序列中最小的后,交換位置,獲得最小元素,依次往后 lst[1,14,25,31,21,13,6,8,14,9,7] def selection_sort(lst):for i in range(len(lst)):min_inde…

組態王Kingview配置為OPCUA服務器的一些問題處理

一、問題描述 1、組態王【運行配置】界面沒有【服務配置】的選項,無法將組態王Kingview配置為OPCUA服務器; 2、點擊組態王【運行配置界面】的【服務配置】選項彈窗警告提示【試圖執行的操作不受支持】,如下圖所示: 二、問題分析 …

模塊二 單元4 安裝AD+DC

模塊二 單元4 安裝ADDC 兩個任務: 1.安裝AD活動目錄 2.升級當前服務器為DC域控制器 安裝前的準備工作: 確定你要操作的服務器系統(Windows server 2022); 之前的服務器系統默認是工作組的模式workgroup模式&#xff08…

git clone項目報錯fatal: fetch-pack: invalid index-pack output問題

前情回顧:git項目放在公司服務器上面,克隆等操作需要連接VPN才能操作。由于項目比較大,網速比較慢,克隆項目經常出現fetch-pack: invalid index-pack output。在網上查找各種解決方法。也就這一種有點效果。僅供參考,不…

前端Tailwind CSS面試題及參考答案

解釋 Tailwind CSS 中 w-1/2 和 max-w-md 的區別及適用場景 在 Tailwind CSS 里,w-1/2 和 max-w-md 屬于不同類型的寬度控制類,它們的功能和適用場景存在明顯差異。 w-1/2 是用來設定元素寬度的類。它把元素寬度設定為其父元素寬度的一半。例如&#xff…

《深度剖析:BERT與GPT——自然語言處理架構的璀璨雙星》

在自然語言處理(NLP)的廣袤星空中,BERT(Bidirectional Encoder Representations from Transformers)與GPT(Generative Pretrained Transformer)系列模型宛如兩顆最為耀眼的星辰,引領…

VMware主機換到高配電腦,高版本系統的問題

原來主機是i3 ,windows7系統,vmware 14.0,虛機系統是ubuntu 14.04。目標新機是i7 14700KF,windows11系統。原以為安裝虛擬機,將磁盤文件,虛擬機配置文件拷貝過去可以直接用。 新目標主機先安裝了vmware 15,運行原理虛機&#xff0…

后端框架模塊化

后端框架的模塊化設計旨在簡化開發流程、提高可維護性,并通過分層解耦降低復雜性。以下是常見的后端模塊及其在不同語言(Node.js、Java、Python)中的實現方式: 目錄 1. 路由(Routing)2. 中間件(…

MDG實現BP客商復雜邏輯校驗的方法

引言 項目中可能常用的增強點是USMD_RULE_SERVICE來實現復雜的校驗邏輯,除此之外,SAP對BP主數據還提供了以下的實現方式。 方法1-替換ERP校驗類 眾所周知,BP存在復雜的ERP校驗,主要通過類CL_MDG_BS_FND_BP_CHECK(子…

基于springboot的教務系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 這些年隨著Internet的迅速發展,我們國家和世界都已經進入了互聯網大數據時代,計算機網絡已經成為了整個社會以及經濟發展的巨大動能,各個高校的教務工作成為了學校管理事務的重要目標和任務,因此運用互聯網技術來提高教務的…

TDengine 中的流式計算

簡介 TDengine 中的流計算,功能相當于簡化版的 FLINK , 具有實時計算,計算結果可以輸出到超級表中存儲,同時也可用于窗口預計算,加快查詢速度。 創建流式計算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…

代碼隨想錄day23 回溯part2

39.組合總和 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個 數字可以 無限制重…