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

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

### 可访问high registers的指令

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.


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


### 分配临时变量的指令

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


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


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


### 取临时变量地址的指令

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)


Rd = 0 - Rm

Rd 寄存器值等于负的 Rm 寄存器值。

### 多寄存器访问指令

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


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


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


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


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