ARM指令集(Instruction Set)細節

ARM指令集(Instruction Set)細節

本文旨在深入探討 ARM 指令集(Instruction Set)的細節。這是一個非常廣泛的主題,我會將其分解為關鍵概念、不同版本的區別以及核心特性,并提供一些示例。

ARM 指令集的核心在于 RISC(精簡指令集計算機) 設計哲學,這意味著:

  • 指令數量少且規整:大多數指令長度固定(通常是32位或16位),格式一致,解碼簡單。
  • 加載-存儲架構:只有專門的加載(LDR)和存儲(STR)指令可以訪問內存。所有算術和邏輯運算都是在寄存器之間進行的。
  • 大量的通用寄存器:擁有16個(在AArch32下)或31個(在AArch64下)通用寄存器,減少了訪問內存的次數,提高了效率。

1. 兩種主要指令集狀態:AArch32 與 AArch64

AArch32/64的全稱是 ARM Architecture 32/64-bit

這是理解現代 ARM 指令集的首要概念。ARMv8 架構引入了 64 位執行狀態,并向后兼容 32 位。

特性AArch32 (ARM 32-bit)AArch64 (ARM 64-bit)
架構版本ARMv4T 到 ARMv8-A (兼容模式)ARMv8-A 及更高
指令集ARMThumbThumb-2A64
指令長度ARM: 32-bit; Thumb: 16-bit; Thumb-2: 16/32-bit固定 32-bit
通用寄存器16個 (R0-R15),包括:
- R13: SP (堆棧指針)
- R14: LR (鏈接寄存器)
- R15: PC (程序計數器)
31個 (X0-X30),加上:
- XZR: 零寄存器 (恒為0)
- SP: 堆棧指針 (獨立)
程序計數器是通用寄存器 R15不是通用寄存器,無法直接操作
條件執行大多數指令都可以條件執行(通過條件碼)只有分支等少數指令可以條件執行
操作數第二個操作數非常靈活(立即數 + 移位/循環)尋址模式更嚴格,但仍有靈活性

2. AArch32 下的指令集變體

在 32 位世界中,處理器可以在兩種主要狀態之間切換:

a. ARM 指令集 (32-bit)
  • 特點:高性能、全功能。所有指令都是 32 位寬。
  • 條件執行:這是 ARM 模式的一個標志性特性。幾乎每條指令都可以根據 APSR(程序狀態寄存器)中的條件標志(N, Z, C, V)來條件地執行。
    • 示例:ADDEQ R0, R1, R2 ; 如果相等(Z=1),則執行 R0 = R1 + R2
  • 靈活的第二個操作數
    • 示例 1: ADD R0, R1, #42 ; 立即數
    • 示例 2: ADD R0, R1, R2 ; 寄存器
    • 示例 3: ADD R0, R1, R2, LSL #3 ; 寄存器 R2 邏輯左移 3 位后的值
    • 示例 4: ADD R0, R1, R2, ROR R3 ; 寄存器 R2 循環右移 R3 位后的值
b. Thumb / Thumb-2 指令集 (16/32-bit)
  • 初衷 (Thumb):提供更高的代碼密度。指令是 16 位的,因此占用的內存空間更小。性能通常低于 ARM 模式,因為需要更多指令來完成相同任務。
  • 進化 (Thumb-2):ARMv6T2 及以后版本引入。它混合了 16 位和 32 位指令,在保持高代碼密度的同時,提供了接近 ARM 模式的性能。Thumb-2 是現代 Cortex-M 和 Cortex-R 系列處理器唯一支持的指令集狀態(它們無法執行傳統的 32 位 ARM 指令)。
  • 特點:指令長度可變(2 字節或 4 字節),條件執行能力有限(主要用于分支指令)。

3. AArch64 下的 A64 指令集

這是純粹的 64 位指令集,設計上吸取了 AArch32 的經驗教訓。

  • 固定長度:所有指令都是 32 位寬,解碼簡單。
  • 取消大規模條件執行:只有分支、比較和少數其他指令支持條件執行。這釋放了寶貴的指令編碼空間,用于其他功能。
  • 新的指令編碼:擁有 31 個通用寄存器(X0-X30),64位(X)和32位(W)視圖。
    • ADD X0, X1, X2 ; 64位加法
    • ADD W0, W1, W2 ; 32位加法,結果高32位清零
  • 改進的立即數和尋址模式:雖然不如 AArch32 靈活,但仍然功能強大。
  • 零寄存器XZR/WZR 寄存器始終返回 0,簡化了許多操作(例如,比較、清零)。
    • 示例:MOV X0, XZR ; 將 X0 清零 (實際上是一條 ORR 指令的別名)

4. 關鍵指令類別(通用)

a. 數據處理指令
  • 算術運算ADD, ADC (帶進位加), SUB, SBC (帶借位減), MUL, MLA (乘加)
  • 邏輯運算AND, ORR (或), EOR (異或), BIC (位清除, A AND NOT B)
  • 移位操作LSL (邏輯左移), LSR (邏輯右移), ASR (算術右移), ROR (循環右移)
  • 比較指令CMP (比較,本質上是 SUBS), CMN (負數比較), TST (位測試,本質上是 ANDS), TEQ (相等測試)
b. 加載-存儲指令

這是 ARM 架構的基石。

  • 單寄存器傳輸
    • LDR R0, [R1] ; 從 R1 指向的地址加載一個字到 R0
    • STR R0, [R1] ; 將 R0 中的字存儲到 R1 指向的地址
    • 支持前變址、后變址等多種尋址模式:
      • LDR R0, [R1, #4]! ; 前變址:地址 = R1+4,然后 R1 = R1+4
      • LDR R0, [R1], #4 ; 后變址:地址 = R1,然后 R1 = R1+4
  • 多寄存器傳輸LDM (加載多個), STM (存儲多個),用于高效地操作堆棧和內存塊。
    • 示例:STMDB SP!, {R4-R11, LR} ; 壓棧:將寄存器 R4-R11 和 LR 壓入堆棧 (在函數開頭)
    • 示例:LDMIA SP!, {R4-R11, PC} ; 出棧:從堆棧恢復 R4-R11,并將返回地址直接裝入 PC (函數返回)
c. 分支與控制流指令
  • B label ; 無條件跳轉到標簽 label
  • BL label ; 分支并鏈接:跳轉到標簽,同時將返回地址 (PC+4) 存入 LR (R14)。用于函數調用
  • BX R0 ; 分支并交換指令集(例如,從 ARM 切換到 Thumb,反之亦然)
  • RET X30 ; (A64) 從函數返回,相當于 MOV PC, LR
d. 協處理器和系統指令
  • MRS R0, CPSR ; 將特殊寄存器(如 CPSR)的值移動到通用寄存器 R0
  • MSR CPSR, R0 ; 將 R0 的值移動到特殊寄存器
  • SVC #0x80 ; (AArch32) 發起一個系統調用(軟件中斷)
  • HVC, SMC ; 用于虛擬化和安全監控調用

5. 條件執行(AArch32 的精華)

條件碼附加在指令助記符的后面。條件基于 APSR 中的標志位:

條件碼含義標志位測試
EQ相等Z == 1
NE不相等Z == 0
CS/HS進位置位/無符號高于或相同C == 1
CC/LO進位清零/無符號低于C == 0
MI負數N == 1
PL正數或零N == 0
VS溢出V == 1
VC無溢出V == 0
HI無符號高于(C == 1) && (Z == 0)
LS無符號低于或相同(C == 0) || (Z == 1)
GE有符號大于或等于N == V
LT有符號小于N != V
GT有符號大于(Z == 0) && (N == V)
LE有符號小于或等于(Z == 1) || (N != V)
AL總是執行無條件

示例:高效的除法余數計算

; C 代碼: if (a > b) { a = a - b; }
; R0 = a, R1 = b
CMP R0, R1       ; 比較 a 和 b
SUBHI R0, R0, R1 ; 如果 a > b (無符號), 則執行 a = a - b
; 這避免了分支指令,提高了效率(無流水線沖刷)。

總結

  • ARM (AArch32):功能強大,靈活性高,以條件執行和靈活的桶式移位器為特點。
  • Thumb-2:代碼密度高,性能好,是 Cortex-M 系列的默認和唯一選擇。
  • A64 (AArch64):現代 64 位設計,規則化,擁有更多寄存器,專注于性能和能效,用于高端應用處理器。

理解 ARM 指令集的關鍵在于實踐。使用 QEMU 模擬器或一塊簡單的開發板(如 Raspberry Pi 或 STM32 Nucleo),通過反匯編編譯器生成的代碼,是學習細節的最佳方式。

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

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

相關文章

Vue基礎知識-Vue集成 Element UI全量引入與按需引入

一、方式一:全量引入 Element UI全量引入即一次性加載 Element UI 所有組件和樣式,優點是配置簡單,適合快速開發;缺點是打包體積較大,生產環境可能存在冗余。1. 安裝 Element UI全量引入只需安裝 Element UI 核心依賴&…

leetcode26(字母異位詞分組)

給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。示例 1:輸入: strs ["eat", "tea", "tan", "ate", "nat", "bat"]輸出: [["bat"],["nat","…

光平面標定 (Laser Plane Calibration) 的原理和流程

光平面標定 (Laser Plane Calibration) 是線激光3D相機系統中最為關鍵且精巧的一步,它直接決定了最終的測量精度。 核心目標 光平面標定的目標是:精確地求出激光器發射出的那個扇形激光平面,在相機坐標系下的數學方程。 這個方程通常表示為一般式: Ax + By + Cz + D = 0…

項目1——單片機程序審查,控制系統項目評估總結報告

執行摘要 本報告對基于STM32F103RET6的老虎機控制系統進行了全面的技術評估。通過深入分析代碼結構、系統架構、安全機制和潛在風險,為項目的進一步開發和部署提供專業建議。 核心發現 ? 系統架構: 設計合理,模塊化程度高?? 安全性: 存在輸入驗證和并…

【Qt應用程序】

Qt應用程序摘要概述快速開始Qt在線下載與安裝Visual Studio開發Qt項目VS配置Qt擴展VS創建Qt項目配置qDebug調試信息配置源程序的字符集項目結構對象樹與內存回收基礎數據類型信號槽定時器窗口QWidgetQMainWindowQDialog窗口布局窗口中添加右鍵菜單控件按鈕類容器類自定義控件事…

機器學習實戰(一): 什么是機器學習

機器學習:讓機器學會思考的魔法前言 在當今數字化的浪潮中,人工智能無疑是最引人注目的技術之一,而機器學習正是其核心驅動力。它不再是科幻電影中的遙遠設想,而是已經滲透到我們日常生活的方方面面,從智能推薦到自動駕…

java流水號生成方式

1、基于時間戳生成流水號利用當前時間戳生成流水號,可以確保唯一性。通過格式化時間戳,可以生成固定位數的流水號。SimpleDateFormat sdf new SimpleDateFormat("yyyyMMddHHmmssSSS"); String serialNumber sdf.format(new Date());特點&…

前端工具大全:前端開發工具、前端調試工具、前端性能優化工具與構建工具的對比與最佳實踐

在現代前端開發中,工具鏈已經成為開發效率與代碼質量的關鍵。無論是 編輯器與 IDE、構建與打包工具、調試工具 還是 性能優化工具,每一個環節都有成熟的解決方案。 然而,工具太多也容易讓團隊選擇困難:該選 VS Code 還是 WebStorm…

ABAP 使用ECHARTS實現圖表展示

最近發現ECHARTS可以整合到SAP中的開源項目,可以絲滑的在SAP中展示各種圖表,還是相當驚艷的。 ECHARTS官方網站:https://echarts.apache.org/examples/zh/index.html 今天順手在開發環境成功安裝了,做下記錄: 1、ABA…

hot100-貪心算法(附圖解思路)

貪心算法的核心,就是用局部最優去代替全局最優。一般的步驟就是去試思路,然后舉反例,如果舉不出反例,基本可以看作是正確的方法。121. 買賣股票的最佳時機(Best Time to Buy and Sell Stock)難度&#xff1…

從齒輪到智能:機器人如何重塑我們的世界【科普類】

新晉碼農一枚,小編會定期整理一些寫的比較好的代碼和知識點,作為自己的學習筆記,試著做一下批注和補充,轉載或者參考他人文獻會標明出處,非商用,如有侵權會刪改!歡迎大家斧正和討論!…

python超市購物 2025年6月電子學會python編程等級考試一級真題答案解析

python超市購物 2025年6月 python編程等級考試一級真題 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】 1、Python比賽 信息素養大賽Python編程挑戰賽 藍橋杯python選拔賽真題詳解

淺談代理流程自動化 (APA)

一、什么是APA Agentic Process Automation (APA)APA 利用大型語言模型 (LLM) 自動執行復雜的動態工作流程。它可以自主構建、執行和調整工作流程,同時將人員干預降至最低。與依賴基于規則的系統的傳統機器人流程自動化 (RPA&…

LeetCode - 和為K的子數組 / 爬樓梯

?歡迎光臨小站:致橡樹 和為K的子數組 給你一個整數數組 nums 和一個整數 k ,請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 示例 1: 輸入:nums [1,1,1], k 2 輸出:2示例…

day40 SQLite3單詞查詢程序設計與實現

day40 SQLite3單詞查詢程序設計與實現 核心知識點 SQLite3 C接口應用:使用sqlite3_open、sqlite3_exec等函數操作數據庫回調函數機制:通過回調函數處理查詢結果集SQL語句構建:動態生成SELECT、INSERT等SQL語句事務處理:使用BEGIN …

GitHub 熱榜項目 - 日榜(2025-09-08)

GitHub 熱榜項目 - 日榜(2025-09-08) 生成于:2025-09-08 統計摘要 共發現熱門項目:17 個 榜單類型:日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術趨勢:AI智能體與LLM應用持續爆發(emcie-co/parlant、coleam00…

設計模式-工廠方法原型模板方法外觀

設計模式概述 - 工廠方法 & 原型 & 模板方法 & 外觀 工廠方法模式簡述 工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它定義了一個用于創建對象的接口,但由子類決定實例化哪個類。工廠方法將類的實例化…

推動檢測認證行業邁向智能化 AITIC一體機發布會在京舉辦

來源:新華社客戶端國家市場監督管理總局認證認可技術研究中心(簡稱“認研中心”)近日聯合技術合作伙伴在北京舉辦AITIC軟硬件一體機發布會。據了解,“AITIC一體機”是專為檢測認證行業設計的智能硬件,提供低成本的本地化部署方案,…

權限即數據:企業系統中的字段級訪問控制架構實戰(β=0.6)

摘要 這篇文章介紹了一個企業系統中的字段權限解析方案,通過規則表與命中記錄表(biz_rule_hit)聯動,實現對業務數據的動態權限控制。流程包括替換用戶上下文變量、記錄命中規則、查詢業務數據并關聯命中信息,最終在內存…

Python爬蟲實戰:研究Specialty Plots模塊,構建空氣質量監測數據采集和分析系統

1. 引言 1.1 研究背景 隨著全球城市化進程的加速和工業的快速發展,空氣質量問題已成為影響人類健康和生態環境的重要因素。世界衛生組織數據顯示,全球超過 90% 的人口生活在空氣質量超標的環境中,空氣污染每年導致約 700 萬人過早死亡。準確、及時地獲取和分析空氣質量數據…