常用ARM汇编

编程入门 行业动态 更新时间:2024-10-24 10:16:01

<a href=https://www.elefans.com/category/jswz/34/1769776.html style=常用ARM汇编"/>

常用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: 非负

更多推荐

常用ARM汇编

本文发布于:2023-11-15 07:44:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1596144.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:常用   ARM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!