文章目录

  • 1 Cortex-M3内核的指令系统
  • 1.1 指令系统简介
  • 1.2 数据传送指令
  • 1.3 中断开关指令
  • 1.4 条件跳转指令
  • 1.5 运算指令


1 Cortex-M3内核的指令系统

1.1 指令系统简介

指令系统简介:

  • Cortex-M3使用的是Thumb-2指令集,长度可为16位或者32位。指令可以带后缀,如有条件的执行。示例:CBZ R0, label,如果R0为0,则跳转;否则什么都不做。

典型写法:

内核代码里可以用memset_指令系统


指令分类:

  • 数据传送指令。
  • 数据处理指令。
  • 子程序调用及无条件跳转指令。
  • 标志位与条件转移指令。
  • 饱和运算指令。
  • 其它指令。

1.2 数据传送指令

存储器访问:

  • LDR/LDRB Rd, =LABEL,加载符合LABEL对应的地址,存储到Rd中。
  • LDR/LDRB Rd, [Rs],从Rs寄存器取出地址,读取相应的32位/8位数据,存储到Rd寄存器。
  • STR/STRB Rd, [Rs],从Rs寄存器中取出地址,将Rd中的32位/8位数据存储到相应的地址处。

批量存储器访问:

  • LDMIA, Rd!, {Rn, ... , Rm},从Rd处连续多次递增地址读取32位数据,存储到后面指令的寄存器列表。
  • STMDB, Rd!, {Rn, ... , Rm},从Rd处连续多次递减地址存储32位数据,数据来自后面的寄存器列表。

IA(Increase After)表示在操作完成后递增地址;DB(Decrease Before)表示在操作开始前递减地址。

!操作结束后,将最终的地址保存到Rd寄存器中。

MRS和MSR:

MRS和MSR用于访问xPSR、PSP、MSP等:

  • MRS Rn, <SReg>,加载寄存器的值到Rn。
  • MSR <SReg>, Rn:存储Rn的值到寄存器中。

1.3 中断开关指令

中断开关:

  • CPSID I:关中断。
  • CPSIE I:开中断。

1.4 条件跳转指令

无条件跳转:

  • BX Rn:移到寄存器reg给出的地址,比如BX LR可用于子程序的返回。

比较条件并跳转:

  • CBZ Rn, <label>:如果Rn的寄存器不为0,则跳转到label对应的指令,否则执行下一条指令。
  • CBNZ Rn, <label>:如果Rn寄存器值不为0,则跳转到label对应的指令,否则执行下一条指令。

1.5 运算指令

逻辑或操作:

  • ORR Rd, Rn, #imm12:Rd = Rn | imm12。

参考资料:

  1. 【李述铜】从0到1自己动手写嵌入式操作系统