ARM-指令集全解析:從基礎到高階應用

一、ARM 指令集體系結構版本

ARM 公司定義了多個指令集版本:

  • ARMv1:原型機 ARM1,沒有用于商業產品。

  • ARMv2:擴展 V1,包含 32 位乘法指令和協處理器指令。

  • ARMv3:第一個微處理器 ARM6 核心,支持 Cache、MMU、寫緩沖。

  • ARMv4:應用最廣泛的 ARM 指令集版本。

    • ARM7TDMI、ARM720T、ARM9TDMI、ARM940T、ARM920T、StrongARM。

  • ARMv5

    • ARM9E-S、ARM966E-S、ARM1020E、ARM1022E、XScale → 基于 ARMv5TE。

    • ARM9EJ-S、ARM926EJ-S、ARM7EJ-S、ARM1026EJ-S → 基于 ARMv5EJ。

    • ARM10 也采用。

    • 后綴含義:

      • E:增強型 DSP 指令集,算法和 16 位乘法操作。

      • J:支持 Java。

  • ARMv6

    • ARM11 系列。

    • ARM1136J(F)-S:SIMD、Thumb、Jazelle、DBX、VFP、MMU。

    • ARM1156T2(F)-S:SIMD、Thumb-2、VFP、MPU。

    • ARM1176JZ(F)-S:增加 MMU、TrustZone。

    • ARM11 MPCore:支持 1~4 核 SMP、MMU。

  • ARMv7-A:Cortex A7 等。

二、常用指令

1. MOV 指令

  • 加載立即數到寄存器或寄存器值傳遞。
mov r0, #2   ; 加載立即數 2 到寄存器 r0
mov r1, r0   ; 將 r0 的值加載到 r1

2. ADD / SUB 指令

ADD Rd, Rn, #const
ADD Rd, Rn, Rm, <shift>SUB Rd, Rn, #const
SUB Rd, Rn, Rm, <shift>

3. 移位操作

  • LSL:邏輯左移

  • LSR:邏輯右移

  • ASR:算術右移(保持符號位)

  • ROR:循環右移

  • RRX:帶進位右移 1 位

移位可由立即數或寄存器指定,影響進位標志 C。

4. 立即數定義(imm12)

ARM 指令中的立即數并非任意 32 位數,而是 12 位立即數 (imm12),由以下規則決定:

  • 條件 1:數值范圍在 0~0xFF 之間時一定是立即數。

  • 條件 2:把數寫成二進制后,從最高位 1 到最低位 1 之間的位數 ≤ 8 位。

  • 條件 3:補足 8 位后,右邊必須是偶數個連續的 0。

實際上 ARM 將 imm12 編碼為:

  • 8 位常數 (0~255) + 4 位循環右移位數 (0~15)
  • 旋轉步長是 2,即可表示 0~30 偶數位的右移。

示例:

  • 0x234 = 0000 0010 0011 0100 → 符合條件,是立即數。

  • 0x3F4 = 0000 0011 1111 0100 → 符合條件,是立即數。

  • 0x132 = 0000 0001 0011 0010 → 末尾只有 1 個 0,不符合條件。

  • 0x7F8 = 0000 0111 1111 1000 → 末尾 3 個 0,不滿足條件。

  • 0xFAB4 = 1111 1010 1011 0100 → 位寬超過 8 位,不是立即數。

5. LDR / STR 指令

  • 加載和存儲數據:
ldr r0, =0x2FAB4            ; 常量加載
ldr r0, [r1, #4]            ; 偏移尋址
ldr r0, [r1], #8            ; 讀后更新基址
ldr r0, [r1, #8]!           ; 先更新基址再讀str r0, [r1, #4]            ; 存儲數據
  • 多寄存器操作:
ldmia r0!, {r1-r4}          ; 從內存加載多個寄存器
stmfd sp!, {r0-r12, lr}     ; 保存現場

6. BIC / ORR 指令

bic Rd, Rn, #const   ; 清零
orr Rd, Rn, #const   ; 置位

7. CMP 指令

  • 比較兩個數,更新標志位。
mov r0, #100
cmp r0, #100   ; Z=1 → 相等

8. 條件執行與條件碼

指令可帶條件碼執行:

  • 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:無條件執行

示例:

movcs r0, #100   ; 僅 C=1 時執行

9. B / BL / BX跳轉指令

指令功能描述PC 的變化LR 的變化跳轉目標常見用途
B無條件跳轉(類似 gotoPC ← PC + 偏移量(立即數)不變立即數偏移(label 地址)循環、分支、跳轉到異常處理
BL跳轉并保存返回地址(函數調用)PC ← PC + 偏移量(立即數)LR ← 調用點下一條指令的地址立即數偏移(label 地址)子程序調用(函數調用)
BX跳轉到寄存器地址PC ← 指定寄存器的值不變任意寄存器(如 LR、R0)子程序返回(常見 bx lr

三、棧操作

  • ARM 采用 滿減棧 (Full Descending)

入棧

stmfd sp!, {r0, r1, r2, r3-r12, lr}

出棧

ldmfd sp!, {r0, r1, r2, r3-r12, lr}

棧的實現方式

  • 空增:先寫入數據,再自增

  • 空減:先寫入數據,再自減

  • 滿增:先自增,再寫入數據

  • 滿減:先自減,再寫入數據(ARM 采用)

類型含義壓棧操作出棧操作SP 指向
滿減棧 (Full Descending, FD)棧向低地址增長,SP 指向已用單元先遞減 SP → 寫數據讀數據 → 遞增 SP已用單元
滿增棧 (Full Ascending, FA)棧向高地址增長,SP 指向已用單元先遞增 SP → 寫數據讀數據 → 遞減 SP已用單元
空減棧 (Empty Descending, ED)棧向低地址增長,SP 指向空單元寫數據 → 遞減 SP遞增 SP → 讀數據空單元
空增棧 (Empty Ascending, EA)棧向高地址增長,SP 指向空單元寫數據 → 遞增 SP遞減 SP → 讀數據空單元

四、函數與參數傳遞

匯編調用 C

import func_c
bl func_c

C 調用匯編

extern void func_asm(void);
func_asm();

參數傳遞規則

  • 前 4 個參數 → r0 ~ r3

  • 返回值 → r0

  • 超過 4 個參數 → 棧傳遞

函數嵌套與現場保護

  • LR 會保存返回地址,但函數嵌套時 LR 會被覆蓋。

  • 解決方法:調用前使用棧保存 LR 和相關寄存器,返回時恢復。

五、模式切換與 CPSR

CPSR(Current Program Status Register)低 5 位決定工作模式:

  • User、FIQ、IRQ、Supervisor、Abort、Undefined、System

指令

mrs r0, cpsr        ; 讀 CPSR
msr cpsr_c, r0      ; 寫 CPSR

常見操作:

  • 切換工作模式:修改低 5 位

  • 開關中斷:修改 I、F 位

六、ROM 類型分類

類型是否可編程是否可擦除擦除方式擦寫次數應用場景
Mask ROM制造時固化不可擦寫大批量固定程序
PROM一次一次性小批量定制程序
EPROM紫外線少量(幾十次)開發測試
EEPROM電擦除(字節級)10^5 ~ 10^6BIOS、配置數據
Flash ROM電擦除(塊/扇區)10^4 ~ 10^5SSD、U盤、嵌入式系統

Flash ROM 分類總結表

類型訪問方式讀取速度寫入/擦除速度容量范圍成本常見應用
NOR Flash隨機訪問(字節級/字尋址)MB ~ 數百 MB固件、Bootloader、系統代碼存儲
NAND Flash頁/塊訪問較慢GB 級U 盤、SSD、SD 卡、大容量數據存儲

七、基本代碼實現

ARM匯編語言

	area reset, readonly, codepreserve8code32entry;ldr r0, =0x40000000;ldr r1, =0x3456781A;str r1, [r0, #4] ;*(r0 + 1) = r1	 ;str r1, [r0], #4   ;*r0++ = r1;str r1, [r0, #4]! ;*++r0 = r1;ldr r0, =0x40000000;ldr r3, [r0];ldr r0, = 0x40000004;ldr r4, [r0];add r5, r3, r4;ldr r0, =0x40000008;str r5, [r0];mov r0, #0;orr r0, r0, #(1 << 7)	  ;0000 0000 0000 0000 0000 0000 1000 0000;ldr r0, =0x7FFFFFFF	;adds r0, r0, #1;mov r0, #3;mov r1, #5;mov r2, #4;cmp r0, r1;movls r3, r1;movge r3, r0;cmp r3, r2;movls r3, r2;b lable	  ;branch;mov r0, #3;mov r1, #5
;lable
;	mov r0, #5
;	mov r1, #3	
;	mov r2, #4
;	cmp r0, r1
;	bls less
;	bgt great
;great	
;	mov r3, r0
;	b  lable
;less
;	mov r3, r1	  ;lable
;	cmp r3, r2
;	bgt finished
;	mov r3, r2    
; 	mov r0, #1		;i
;	mov r1, #0		;sum;loop	
;	cmp r0, #100
;	bgt finished
;	add r1, r1, r0
;	add r0, r0, #1
;	b loopldr pc, =_start_asm_maxstmfd sp!, {r0-r12, lr}bl _asm_minldmfd sp!, {r0-r12, lr} cmp r0, r1movge r2, r0movlt r2, r1bx lrexport _asm_min
_asm_mincmp r0, r1movle r2, r0movgt r2, r1mov r0, r2bx lr		_startldr sp, =0x40001000mrs r0, cpsr;xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxx0 0000bic r0, r0, #0x1Forr r0, r0, #0x10 ;0001 0000msr	cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024import mainb main;stmfd sp!, {r0-r12, lr};import c_max;mov r0, #2;mov r1, #3;bl c_max;ldmfd sp!, {r0-r12, lr};mov r0, #11;mov r1, #22finishedb finished	end

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

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

相關文章

第3講 機器學習入門指南

近年來&#xff0c;隨著企業和個人生成的數據量呈指數級增長&#xff0c;機器學習已成為日益重要的技術領域。從自動駕駛汽車到流媒體平臺的個性化推薦&#xff0c;機器學習算法已廣泛應用于各個場景。讓我們深入解析機器學習的核心要義。3.1 機器學習定義機器學習是人工智能的…

深入理解跳表:多層索引加速查找的經典實現

跳表&#xff08;Skip List&#xff09;是一種多層有序鏈表結構&#xff0c;通過引入多級索引加速查找&#xff0c;其核心設計類似于“立體高速公路系統”&#xff0c;底層是原始鏈表&#xff0c;上面有各種高度的"高架橋"。 高層道路跨度大&#xff0c;連接遠方節點…

Flutter 視頻播放器——flick_video_player 介紹與使用

在移動端應用中&#xff0c;視頻播放是一個常見的功能場景&#xff0c;例如短視頻、直播、課程、廣告展示等。 Flutter 本身并沒有直接提供視頻播放器組件&#xff0c;而是依賴第三方庫來實現。 今天要介紹的庫是 flick_video_player&#xff0c;它基于 video_player 封裝&…

編寫cmakelists文件常用語句

cmake_minimum_required (VERSION 3.10) 指定最小版本project(XXXX) 指定項目名字 ---------------set(MAIN_EXEC_NAME dwarf_parser) 定義變量${ MAIN_EXEC_NAME } 變量取值set(CMAKE_CXX_STANDARD 14) 指定c14標準&#xff0c;還有11、17、20等標準…

麒麟桌面系統找不到mbr啟動,并重新安裝grub

根據你提供的情況,“麒麟桌面系統找不到MBR啟動”,這通常是由于GRUB引導損壞、MBR記錄丟失或分區表異常導致的。你可以按照以下步驟重新安裝GRUB并修復MBR啟動: ? 步驟一:準備工具 使用銀河麒麟LiveCD或U盤啟動盤(可用Ventoy制作); 啟動電腦,選擇從U盤或光盤進入Live環…

【音頻字幕】構建一個離線視頻字幕生成系統:使用 WhisperX 和 Faster-Whisper 的 Python 實現

一、背景介紹 對于一端沒有字幕外國視頻、字幕&#xff0c;在不懂外語的情況下&#xff0c;怎么獲取相關內容&#xff1f;作為技術宅&#xff0c;怎么自建搭建一個語音轉文字的環境當前AI技術這么發達&#xff1f; 試試 二、系統設計 音頻提取(僅僅是視頻需要該邏輯、本身就是音…

Linux ALSA架構:PCM_OPEN流程 (二)

一 應用端源碼路徑: external\tinyalsa\pcm.c external\tinyalsa\pcm_hw.cstruct pcm *pcm_open(unsigned int card, unsigned int device,unsigned int flags, struct pcm_config *config) {...pcm->ops &hw_ops;pcm->fd pcm->ops->open(card, device,…

tp5的tbmember表閉包查詢 openid=‘abc‘ 并且(wx_unionid=null或者wx_unionid=‘‘)

閉包查詢 tbmember表閉包查詢查詢 openid‘abc并且islose0并且islogout0并且&#xff08;wx_unionidnull或者wx_unionid’&#xff09; Db::table(tbmember)->where([openid>abc,islose>0,islogout>0])->where(function ($query){$query->where(wx_unioni…

邪修實戰系列(3)

1、第一階段邪修實戰總覽&#xff08;9.1-9.30&#xff09; 把第一階段&#xff08;基礎夯實期&#xff09;的學習計劃拆解成極具操作性的每日行動方案。這個計劃充分利用我“在職學習”的特殊優勢&#xff0c;強調“用輸出倒逼輸入”&#xff0c;確保每一分鐘的學習都直接服務…

【GD32】ROM Bootloader、自定義Bootloader區別

Bootloader是應用程序跑起來之前&#xff0c;用于初始化的一段程序&#xff0c;它分為兩種&#xff0c;ROM Bootloader、自定義Bootloader。GD32芯片出廠時預燒錄在ROM中的Bootloader&#xff08;以下簡稱ROM Bootloader&#xff09;和自己編寫的Bootloader&#xff08;以下簡稱…

Linux防火墻-Firewalld

一、 概述 按表現形式劃分&#xff1a; 軟件防火墻&#xff1a; 集成在系統內部&#xff0c;Linux系統&#xff1a; iptables、firewalld、ufw&#xff1b; windows系統下&#xff1a; windows defender 硬件防火墻&#xff1a; 華為防火墻、思科防火墻、奇安信防火墻、深信服防…

【Qt】PyQt、原生QT、PySide6三者的多方面比較

目錄 引言 一、基本定義 二、核心對比維度 1. 編程語言與開發效率 2. 功能與 API 兼容性 3. 性能表現 4. 許可證與商業使用 5. 社區與文檔支持 三、遷移與兼容性 四、適用場景推薦 五、總結對比表 總結 引言 PySide6、PyQt&#xff08;通常指 PyQt5/PyQt6&#xf…

JavaWeb站內信系統 - 技術設計文檔

1. 系統概述1.1 項目背景本系統旨在為企業或社區平臺提供一套完整的站內信解決方案&#xff0c;支持用戶之間的消息發送、接收、管理等功能&#xff0c;提升用戶間的溝通效率。1.2 設計目標實現用戶間消息發送和接收支持一對一和一對多消息發送提供消息狀態跟蹤&#xff08;已讀…

Java基礎 9.10

1.System類常見方法和案例exit&#xff1a;退出當前程序arraycopy&#xff1a;復制數組元素&#xff0c;比較適合底層調用&#xff0c;一般使用 Arrays.copyOf 完成復制數組int[] src{1,2,3};int[] dest new int[3]; System.arraycopy(src, 0, dest, 0, 3);currentTimeMilens&…

詳解flink性能優化

1. 簡介 Apache Flink是一個強大的流處理框架&#xff0c;其性能很大程度上取決于內存的使用效率。在大規模數據處理場景中&#xff0c;合理的內存配置和優化可以顯著提升Flink作業的性能和穩定性。本文將深入探討Flink內存優化的各個方面&#xff0c;包括狀態后端選擇、內存配…

VueFlow的箭頭怎么調整

正好最近用到了VueFlow組件&#xff0c;發現箭頭默認樣式太小&#xff0c;無法體現流程展示&#xff0c;因此翻閱相關資料得出下列方法&#xff0c;有什么更好的方法&#xff0c;大家可以推薦推薦&#xff0c;謝謝。方法1&#xff1a;通過邊&#xff08;Edge&#xff09;的樣式…

【Python】S1 基礎篇 P9 文件處理與異常處理技術

目錄文件讀取操作讀取文件的全部內容相對路徑和絕對路徑逐行訪問文件內容文件寫入操作寫入單行內容寫入多行內容結構化數據的存儲異常處理機制理解異常的工作原理ZeroDivisionError異常示例try-except語句塊的使用else語句塊的正確使用靜默失敗的合理應用本文將深入探討Python中…

分布式事務實戰手冊:從四場業務災難看方案選型與落地陷阱

在分布式系統的穩定性戰役中&#xff0c;數據一致性問題如同潛伏的暗礁。某生鮮電商因分布式事務設計缺陷&#xff0c;在春節促銷期間出現"下單成功但無庫存發貨"的悖論&#xff0c;3小時內產生2300筆無效訂單&#xff0c;客服投訴量激增300%&#xff1b;某銀行轉賬系…

Java算法題中的輸入輸出流

在Java算法題中&#xff0c;處理輸入輸出主要依賴系統流&#xff08;System.in和System.out&#xff09;&#xff0c;常用的方法總結如下&#xff1a; 一、輸入方法&#xff08;讀取系統輸入&#xff09; 主要通過java.util.Scanner類或BufferedReader類實現&#xff0c;適用于…

墨水屏程序

EPD Reader 基于ESP32-C3的電子墨水屏閱讀器&#xff0c;支持ap 配網、sntp 時間同步、txt閱讀、天氣預報、顯示節假日信息、農歷顯示、自動休眠、web配置等功能。這是在另一個項目 一個rust embassy esp32c3 的練習項目-CSDN博客的基礎上修改的 。 界面比較粗糙&#xff0c;以…