对Cortex-M0/M0+难理解指令的解释

对部分需要加以注意或者不知道干嘛用的Cortex-M0/M0+指令给予个人理解层面的解释。完整的指令集请参考《Cortex-M0/M0+指令集》

mingdu.zheng at gmail dot com
http://blog.csdn.net/zoomdy/article/details/79308903

可访问high registers的指令

绝大部分指令只能访问low registers,也就是只能访问R0~R7寄存器。可以访问high registers的指令只有两条,这两条指令都不更新APSR,指令没有S后缀。

MOV  <Rd>, <Rm> // Rm and Rn can be high or low registers.
ADD  <Rd>, <Rm> // Rd = Rd + Rm. Rd, Rm can be high or low registers.

其它两条和SP加法有关的可以访问high registers的指令其本质是ADD指令。

ADD  SP, <Rm>        // 相当于 Rd 为 SP 的 ADD <Rd>, <Rm>
ADD  <Rd>, SP, <Rd>  // 相当于 Rm 为 SP 的 ADD <Rd>, <Rm>

分配临时变量的指令

函数内的临时变量分配到堆栈,进入函数给临时变量分配空间时使用SUB指令。

SUB  SP, SP, #immed7     // SP = SP – ZeroExtend(#immed7<<2)

退出函数释放临时变量空间时使用ADD指令。

ADD  SP, SP, #immed7     // SP = SP + ZeroExtend(#immed7<<2)

上面两条指令的立即数只有7位,最多可以增减SP指针127个字空间,如果超过127个字,使用这条指令:

ADD  SP, <Rm>            // SP = SP + Rm. Rm can be high or low register.

只有ADD指令,没有SUB指令,如果需要SUB,那么给Rm赋值负数即可。

取临时变量地址的指令

在堆栈分配了临时变量空间后,总要取得临时变量的地址才能做进一步的操作。

ADD  <Rd>, SP, #immed8   // Rd = SP + ZeroExtend(#immed8<<2)

立即数不够,可以用寄存器。

ADD  <Rd>, SP, <Rd>      // Rd = Rd + SP. Rd can be high or low register.

RSBS指令

RSBS <Rd>, <Rn>, #0       // Rd = 0 – Rm, Reverse Subtract (negative)

这是倒过来的减法,常量减去寄存器值,而且常量只能是0。所以这条指令实质上就是一条取负数指令。
Rd = 0 - Rm
等价于:Rd = -Rm
Rd 寄存器值等于负的 Rm 寄存器值。

多寄存器访问指令

多寄存器加载指令

LDMIA <Rn>!, {<Ra>, <Rb>,..} // Load Multiple Increment After

用C语言来解释

p = Rn;
Ra = *p++;
Rb = *p++;
...
Rn = p;

多寄存器存储指令

STMIA <Rn>!, {<Ra>, <Rb>,..} // Store Multiple Increment After

用C语言来解释

p = Rn;
*p++ = Rn;
*p++ = Rb;
...
Rn = p;

LDMIA/STMIA用来优化大量数据访问的情况,Increment After 地址递增方式符合C语言的操作习惯,即从低地址开始,访问过后累加地址。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cortex-M0/M0指令集是由ARM公司开发的一种32位精简指令集架构。它主要针对低功耗、成本效益和较低性能要求的嵌入式系统设计,特别适用于传感器、智能控制器、消费类电子产品等领域。 Cortex-M0/M0指令集具有丰富的指令集扩展方式,包括Thumb指令集和Thumb-2指令集。这些指令集旨在提供更高的代码密度和更低的功耗消耗。Thumb指令集是16位指令集,适用于代码密度较高,但需要较多指令执行的应用场景。Thumb-2指令集是一种混合指令集,兼容ARM指令集和Thumb指令集,既能提供更高的代码密度,又能提供更高的性能。 Cortex-M0/M0指令集还支持多种编程模型,包括裸机编程和实时操作系统(RTOS)编程。在裸机编程中,程序员可以直接控制硬件资源,实现底层的控制和处理。而在RTOS编程中,程序员可以通过操作系统提供的API功能,更方便地管理任务调度、资源分配和中断处理。 此外,Cortex-M0/M0指令集还提供了丰富的中断管理功能。通过硬件中断管理支持,程序员可以实现快速的中断响应和处理。并且,Cortex-M0/M0指令集还支持低功耗模式,可进一步降低功耗消耗。 总结起来,Cortex-M0/M0指令集是一种专为嵌入式系统设计的32位精简指令集架构。它具有丰富的指令集扩展方式、支持多种编程模型和中断管理功能,适用于低功耗、成本效益和较低性能要求的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值