常用ARM汇编

1. 数据处理指令:

  • ADD, SUB, MUL: 算术操作(加、减、乘)。
  • AND, ORR, EOR, BIC: 逻辑操作(与、或、异或、位清除)。
  • MOV, MVN: 寄存器传送和取反。
  • CMP, CMN, TST, TEQ: 比较操作。

示列:

算术操作:
  • ADD Rn, Rm, Operand2: 将 Rm 和 Operand2 的值相加,并存入寄存器 Rn。
  • SUB Rn, Rm, Operand2: 从 Rm 减去 Operand2 的值,并将结果存储在 Rn。
  • MUL Rn, Rm, Rs: Rm 乘以 Rs,并将结果存储在 Rn。
逻辑操作:
  • AND: AND R0, R1, R2 - R0 = R1 AND R2。将R1和R2的按位与结果存储到R0。
  • ORR: ORR R0, R1, R2 - R0 = R1 OR R2。将R1和R2的按位或结果存储到R0。
  • EOR: EOR R0, R1, R2 - R0 = R1 XOR R2。将R1和R2的按位异或结果存储到R0。
  • BIC: BIC R0, R1, R2 - R0 = R1 AND NOT R2。将R1和R2的按位清零结果存储到R0。
寄存器传送和取反:
  • MOVMOV Rn, Operand2: 把 Operand2 的值移动到寄存器 Rn 中。
  • MVNMVN Rn, Operand2: 把 Operand2 的值取反后移动到寄存器 Rn 中。
比较操作:
  • CMP: CMP R0, R1 - 比较R0和R1。将R0和R1的值进行比较,但不存储结果,只更新状态寄存器。
  • CMN: CMN R0, R1 - 比较R0和-R1。将R0和R1的负值进行比较,但不存储结果。
  • TST: TST R0, R1 - 测试R0和R1的按位与。进行按位与操作但不存储结果,只更新状态寄存器。
  • TEQ: TEQ R0, R1 - 测试R0和R1的按位异或。进行按位异或操作但不存储结果。
  • CMP:CMP Rn, Operand2: 比较 Rn 和 Operand2 的值。

2. 分支和跳转指令:

  • B, BL: 无条件跳转和跳转并链接。
  • BX, BLX: 切换到 ARM 或 Thumb 模式并跳转。
  • B.cond: 条件分支,其中 “cond” 是条件代码(例如 BEQ 为等于分支)。

示列:

  • B:B label: 无条件跳转到标签 label
  • BL: BL label: 跳转到 label 并在链接寄存器 (LR) 中保存返回地址。
  • BX:BX Rn: 跳转到寄存器 Rn 中的地址。
BEQ, BNE, BGT, BLT, BGE, BLE`: 有条件的跳转。
  1. BEQ: BEQ label - 如果上一个指令的结果是相等(Zero标志被设置),则跳转到标签label。例如,如果之前的CMP指令比较的两个寄存器值相等,则执行跳转。

  2. BNE: BNE label - 如果上一个指令的结果不等(Zero标志未被设置),则跳转到标签label。例如,如果之前的CMP指令比较的两个寄存器值不相等,则执行跳转。

  3. BGT: BGT label - 如果上一个指令的结果大于(Zero标志未设置且Negative标志等于Overflow标志),则跳转到标签label。通常在比较指令之后使用,比如CMP

  4. BLT: BLT label - 如果上一个指令的结果小于(Negative标志不等于Overflow标志),则跳转到标签label。用于实现小于条件的分支。

  5. BGE: BGE label - 如果上一个指令的结果大于等于(Negative标志等于Overflow标志),则跳转到标签label。这通常用于循环或条件检查。

  6. BLE: BLE label - 如果上一个指令的结果小于等于(Zero标志被设置或Negative标志不等于Overflow标志),则跳转到标签label。用于实现小于或等于的条件跳转。

3. 内存访问指令:

  • LDR, STR: 加载和存储。
  • LDM, STM: 多重加载和存储,用于从/到连续的寄存器组读/写数据。
  • PUSH, POP: 压入和弹出堆栈。

示列:

加载和存储:
  • LDR Rn, [Rm, #offset]: 从内存地址 (Rm + offset) 加载值到 Rn。
  • STR Rn, [Rm, #offset]: 将 Rn 的值存储到内存地址 (Rm + offset)。
多重加载和存储:
  • LDM: LDM R0!, {R1-R3} - 从R0指向的地址加载多个寄存器(R1到R3),R0的值自动增加。
  • STM: STM R0!, {R1-R3} - 将多个寄存器(R1到R3)的数据存储到R0指向的地址,R0的值自动增加。
压栈和出栈:
  • PUSH: PUSH {R0-R3} - 将寄存器R0到R3的值压入堆栈。
  • POP: POP {R0-R3} - 从堆栈中弹出数据到寄存器R0到R3。

4. 异常和中断处理指令:

  • SVC: 软件中断。
  • CPS: 更改处理器状态。

示列:

  • SVC: SVC #0 - 软件中断指令,通常用于调用操作系统服务。
  • CPS: CPS ID - 更改程序状态,如中断使能/禁用。

5. 系统指令:

  • MRS, MSR: 从/到特殊寄存器读/写。
  • ISB, DSB, DMB: 同步屏障。

示列:

特殊寄存器读/写:

MRS R0, CPSR 会将当前程序状态寄存器 (CPSR) 的值移动到 R0 寄存器。
MSR CPSR_c, R0 将 R0 寄存器的值复制到 CPSR 的控制字段。

特殊屏障:
  • ISB: ISB - 指令同步障碍,确保之前的所有指令完成。
  • DSB: DSB - 数据同步障碍,确保之前的所有存储操作完成。
  • DMB: DMB - 数据存储障碍,确保之前的所有存储操作对其他处理器可见。

6. 协处理器指令:

  • MCR, MRC: 从协处理器移动数据。

示列:

从协处理器移动数据:
  • MCR: MCR p15, 0, R0, c7, c10, 5 - 将寄存器R0的值移动到协处理器寄存器。
  • MRC: MRC p15, 0, R0, c7, c10, 5 - 从协处理器寄存器移动值到寄存器R0。

7.条件执行码

  • EQ: 等于
  • NE: 不等于
  • CSHS: 大于等于,无符号
  • CCLO: 小于,无符号
  • MI: 负数
  • PL: 非负
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM指令集是一种广泛使用的指令集架构,它主要用于移动设备、嵌入式系统和低功耗服务器等领域。这个指令集架构的发展可追溯到1980年代初,但只有1990年代后期开始得到广泛采用和推广。现在,ARM指令集已经成为了全球最流行的指令集之一。 常用ARM指令集包括ARMv6、ARMv7和ARMv8等。它们的主要区别在于处理器的架构和指令集的扩展。其中,ARMv6是一种比较老的架构,适用于早期的移动设备和嵌入式系统。而ARMv7则是一种更为先进的架构,支持更多的指令集扩展和一些新的特性。ARMv8则是未来的趋势,它支持更多的指令集扩展,包括虚拟寄存器、硬件虚拟化和安全性增强等功能。 除了ARM指令集,汇编语言也是ARM编程的重要组成部分。常用ARM汇编语言包括ARM汇编和Thumb汇编两种。ARM汇编是一种较为底层的汇编语言,它使用32位指令来完成数据处理和控制流操作。而Thumb汇编则是一种更加轻量级的汇编语言,它使用16位指令来完成相同的操作。 针对ARM指令集和汇编语言,有许多文档和教程可供参考。其中最常用的包括ARM体系结构参考手册、ARM汇编编程指南和ARM编程手册等。这些文档都提供了详细的指令集和汇编语言说明,以及实用的编程示例和技巧。同时,还有一些在线资源和社区,如ARM开发者中心和ARM社区等,提供丰富的资讯和交流平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值