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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 万人过早死亡。准确、及时地获取和分析空气质量数据…