ARM 常用汇编指令

简介: 下面是ARM架构中常用汇编指令的总结,涵盖数据处理、数据传输、分支跳转、堆栈操作等类别,方便你快速查阅和理解。

ARM 常用汇编指令分类及说明

  1. 数据处理指令(Arithmetic and Logic)

指令 作用 说明
MOV Rd, Operand2 将操作数移动到寄存器 赋值指令
ADD Rd, Rn, Operand2 加法 Rd = Rn + Operand2
SUB Rd, Rn, Operand2 减法 Rd = Rn - Operand2
RSB Rd, Rn, Operand2 反向减法 Rd = Operand2 - Rn
MUL Rd, Rn, Rm 乘法 Rd = Rn * Rm
AND Rd, Rn, Operand2 按位与 Rd = Rn & Operand2
ORR Rd, Rn, Operand2 按位或 `Rd = Rn
EOR Rd, Rn, Operand2 按位异或 Rd = Rn ^ Operand2
BIC Rd, Rn, Operand2 按位清除 Rd = Rn & ~Operand2
CMP Rn, Operand2 比较 Rn - Operand2,更新状态寄存器
TST Rn, Operand2 测试 按位与,更新状态寄存器

  1. 数据传输指令(Load/Store)

指令 作用 说明
LDR Rd, [Rn, #offset] 从内存加载数据到寄存器 载入字或字节
STR Rd, [Rn, #offset] 将寄存器数据存入内存 存储字或字节
LDMIA Rn!, {Rlist} 递增地址多寄存器加载 从地址Rn开始递增装载多个寄存器
STMIA Rn!, {Rlist} 递增地址多寄存器存储 从地址Rn开始递增存储多个寄存器

  1. 分支指令(Branch)

指令 作用 说明
B label 无条件跳转到标签 跳转指令
BL label 跳转并链接(调用子程序) 同时保存返回地址
BX Rm 跳转到寄存器地址 可用于返回或跳转
BLX label 跳转并链接到地址 支持切换Thumb和ARM状态

  1. 堆栈操作指令(Stack)

指令 作用 说明
PUSH {Rlist} 将寄存器列表入栈 等价于 STMDB SP!, {Rlist}
POP {Rlist} 从栈中弹出寄存器列表 等价于 LDMIA SP!, {Rlist}

  1. 状态寄存器和控制指令

指令 作用 说明
MSR CPSR, Rn 设置程序状态寄存器 修改状态寄存器
MRS Rd, CPSR 读取程序状态寄存器 读取状态寄存器
SVC #imm 软中断(系统调用) 调用操作系统

  1. 其他常用指令

指令 作用 说明
NOP 空操作 无任何操作
SWI #imm 软件中断 触发异常,用于系统调用
CLZ Rd, Rm 计算首个“1”前的零位数 用于优化算法
简单示例代码

MOV R0, #5        ; R0 = 5
MOV R1, #3        ; R1 = 3
ADD R2, R0, R1    ; R2 = R0 + R1 = 8
SUB R3, R2, #1    ; R3 = R2 - 1 = 7
CMP R3, #10       ; 比较R3和10
BNE label_not_equal ; 不等跳转
MOV R4, #0
B end

label_not_equal:
MOV R4, #1
end:
php
267 Bytes
© 菜鸟-创作你的创作
明白!下面我帮你整理一份更详细的ARM汇编指令手册概要,涵盖:

指令格式和条件执行
数据处理指令细节
数据传输指令扩展
分支指令条件控制
特殊指令及用法
并配合代码示例,助你全面掌握ARM汇编。

一、ARM指令格式与条件执行

  1. 指令格式

ARM指令一般为32位固定长度,格式如下:

[cond][opcode][S][Rn][Rd][Operand2]
php
35 Bytes
© 菜鸟-创作你的创作
cond:4位条件码,决定指令是否执行(如EQ、NE、GT等)
opcode:操作码,表示指令类型(ADD、SUB、MOV等)
S:是否更新条件码(状态寄存器)
Rn、Rd:寄存器操作数
Operand2:第二操作数,支持立即数、寄存器等多种形式

  1. 条件执行

ARM指令支持条件执行,节省分支跳转
常用条件码:
条件码 含义 解释
EQ Equal 零标志Z=1,等于
NE Not Equal 零标志Z=0,不等
GT Greater Than Z=0且N=V
LT Less Than N≠V
GE Greater or Equal N=V
LE Less or Equal Z=1或N≠V
AL Always 总是执行
示例:

CMP R0, #0
BEQ zero_label  ; 当R0=0时跳转

php
45 Bytes
© 菜鸟-创作你的创作
二、数据处理指令详解

  1. MOV(数据传送)

    MOV R0, #5 ; R0 = 5
    php
    26 Bytes
    © 菜鸟-创作你的创作
    支持立即数、寄存器、移位操作等

  2. ADD、SUB、RSB(算术)

    ADD R1, R0, #3 ; R1 = R0 + 3
    SUB R2, R1, R0 ; R2 = R1 - R0
    RSB R3, R0, #10 ; R3 = 10 - R0
    php
    103 Bytes
    © 菜鸟-创作你的创作

  3. 逻辑运算(AND, ORR, EOR, BIC)

    AND R0, R1, R2 ; 按位与
    ORR R0, R1, R2 ; 按位或
    EOR R0, R1, R2 ; 异或
    BIC R0, R1, R2 ; 按位清除(R1 & ~R2)
    php
    113 Bytes
    © 菜鸟-创作你的创作

  4. CMP和TST(比较和测试)

CMP:计算Rn - Operand2,更新条件码但不保存结果
TST:计算Rn & Operand2,更新条件码
CMP R0, #10
BGE label ; 如果R0 >= 10跳转
TST R1, #0x1 ; 测试R1最低位是否为1
BEQ label2
php
98 Bytes
© 菜鸟-创作你的创作
三、数据传输指令详解

  1. LDR/STR(加载/存储)

    LDR R0, [R1] ; 从R1指向的地址加载数据到R0
    STR R2, [R1, #4] ; 将R2存储到R1+4地址
    php
    78 Bytes
    © 菜鸟-创作你的创作
    支持预递增/预递减和后递增/后递减寻址
    支持字节(LDRB/STRB)和半字(LDRH/STRH)访问

  2. 多寄存器加载/存储

    LDMIA R0!, {R1-R3} ; 递增地址加载R1-R3,R0递增
    STMDB SP!, {R4-R7} ; 递减地址存储R4-R7,SP递减(堆栈操作)
    php
    91 Bytes
    © 菜鸟-创作你的创作
    四、分支指令详解

  3. B和BL

    B label ; 跳转
    BL func ; 跳转并链接,保存返回地址到LR
    php
    52 Bytes
    © 菜鸟-创作你的创作
    条件分支:
    BEQ label
    BNE label2
    php
    28 Bytes
    © 菜鸟-创作你的创作

  4. BX和BLX

BX Rm:跳转到寄存器地址,支持切换ARM和Thumb状态
BLX label:跳转并链接,支持切换状态
五、特殊指令和系统调用

  1. SVC(软中断,系统调用)

    SVC #0 ; 触发软中断,进入内核态
    php
    28 Bytes
    © 菜鸟-创作你的创作

  2. NOP(空指令)

    NOP ; 无操作,占位
    php
    23 Bytes
    © 菜鸟-创作你的创作
    六、示例综合

    MOV R0, #10
    MOV R1, #20
    ADD R2, R0, R1
    CMP R2, #25
    BGT greater
    MOV R3, #0
    B end
    greater:
    MOV R3, #1
    end:
    php
    136 Bytes
    © 菜鸟-创作你的创作
    https://www.52runoob.com/archives/5397

相关文章
|
3月前
|
并行计算 前端开发 JavaScript
Web Worker:让前端飞起来的隐形引擎
在现代 Web 开发中,前端性能优化是一个至关重要的课题,尤其是对于计算密集型的应用,如图像处理、视频处理、大规模数据分析等任务。单线程的 JavaScript 引擎常常成为性能瓶颈,导致应用变得迟缓。Web Worker,作为一种强大的技术,使得前端能够在后台进行并行计算,从而实现高效的任务处理,不影响主线程的运行和用户的交互体验。
426 108
|
芯片
STM32-FreeRTOS源码下载及移植步骤(基于Keil)
STM32-FreeRTOS源码下载及移植步骤(基于Keil)
1706 0
STM32-FreeRTOS源码下载及移植步骤(基于Keil)
|
数据可视化 图形学 开发者
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
1964 4
|
固态存储 IDE 开发工具
【实战经验分享】如何对SSD固态硬盘下发SCSI command?
目前可以供用来下发SCSI/ATA Command的工具有很多,比如BusHound, Hdparm, Sg3, Msecli等。其中Msecli是Micron自己的专门用来管理Micron SSD的命令行接口, 对于其他家的SSD是无效的。我们这里主要用的Sg3这个工具
|
Linux 开发工具 git
10 推荐免费 Git 仓库
Git 免费仓库 Gitee 开源中国-基于 Git 的代码托管和研发协作平台【推荐】 https://gitee.com/
2396 0
10 推荐免费 Git 仓库
|
网络安全 开发工具 对象存储
OSS 的C++ SDK编译安装指南
OSS 的C++ SDK编译安装指南
OSS 的C++ SDK编译安装指南
|
数据安全/隐私保护
SpringSecurity利用@PreAuthorize注解自定义权限校验
利用@PreAuthorize注解自定义权限校验
3549 0
|
10月前
|
人工智能 供应链 数据可视化
跨境电商供应链优化趋势:从智能库存到绿色物流
高效供应链管理是行业发展的关键,涉及原材料采购、生产制造、库存管理、跨境物流和终端交付等环节。通过数据驱动决策、多供应商合作、灵活物流策略、清关合规和技术赋能,可以优化供应链,提升运营效率。
1103 7
跨境电商供应链优化趋势:从智能库存到绿色物流
|
5月前
|
网络协议 开发工具 git
解决 git 报错 “fatal: unable to access ‘https://github.com/.../.git‘: Recv failure Connection was rese
在使用 Git/Git小乌龟 进行代码管理的过程中,经常会遇到各种各样的问题,其中之一就是在执行 git clone 或 git pull 等操作时出现 “fatal: unable to access ‘https://github.com/…/.git’: Recv failure Connection was reset” 的报错。这个问题通常是由网络连接问题或代理设置不正确导致的。在我的个人使用经验中,我亲自尝试了四种方法,它们都能够有效地解决这个报错。个人比较推荐方法二。
2913 0
|
监控 安全 网络安全
WPA2 与 802.1X:有什么区别?
【10月更文挑战第17天】
1070 1
WPA2 与 802.1X:有什么区别?