处理器使用的是ARMv6-M Thumb指令集,包括大量的32位的使用Thumb-2技术的指令。表7-22列出了Cortex-M0指令和它们的周期数。周期计数以零等待状态的系统为基准。
表7-22 Cortex-M0指令和它们的周期数
操 作 | 描 述 | 汇 编 指 令 | 周 期 |
MOVE | 8-bit immediate | MOVS Rd,#<imm> | 1 |
Lo to Lo | MOVS Rd,Rm | 1 | |
Any to Any | MOV Rd,Rm | 1 | |
Any to PC | MOV PC,Rm | 3 | |
Add | 3-bit immediate | ADDS Rd,Rn,#<imm> | 1 |
All registers Lo | ADDS Rd,Rn,Rm | 1 |
续表
操 作 | 描 述 | 汇 编 指 令 | 周 期 |
| Any to Any | ADD Rd,Rd,Rm | 1 |
Any to PC | ADD PC,PC,Rm | 3 | |
8-bit immediate | ADDS Rd,Rd,#<imm> | 1 | |
With carry | ADCS Rd,Rd,Rm | 1 | |
Immediate to SP | ADD SP,SP,#<imm> | 1 | |
Form address from SP | ADD Rd,SP ,#<imm> | 1 | |
Form address from PC | ADR Rd,<label> | 1 | |
Subtract | Lo to Lo | SUBS Rd,Rn,Rm | 1 |
3-bit immediate | SUBS Rd,Rn,#<imm> | 1 | |
8-bit immediate | SUBS Rd,Rd,#<imm> | 1 | |
| With carry | SBCS Rd,Rd,Rm | 1 |
Immediate from SP | SUB SP,SP,#<imm> | 1 | |
Negate | RSBS Rd,Rn,#0 | 1 | |
Multiply | MULS Rd,Rm,Rd | 1或32 | |
Compare | Compare | CMP Rn,Rm | 1 |
Negative | CMP Rn,Rm | 1 | |
Immediate | CMP Rn,#<imm> | 1 | |
Logical | AND | ANDS Rd, Rd, Rm | 1 |
Exclusive OR | EORS Rd, Rd, Rm | 1 | |
OR | ORRS Rd, Rd, Rm | 1 | |
Bit clear | BICS Rd, Rd, Rm | 1 | |
Move NOT | MVNS Rd, Rm | 1 | |
AND test | TST Rn, Rm | 1 | |
Logical shift left by immediate | LSLS Rd, Rm, #<shift> | 1 | |
Logical shift left by register | LSLS Rd, Rd, Rs | 1 | |
Logical shift right by immediate | LSRS Rd, Rm, #<shift> | 1 | |
Logical shift right by register | LSRS Rd, Rd, Rs | 1 | |
Arithmetic shift right | ASRS Rd, Rm, #<shift> | 1 | |
Arithmetic shift right by register | ASRS Rd, Rd, Rs | 1 | |
Rotate | Rotate right by register | RORS Rd, Rd, Rs | 1 |
Load | Word, immediate offset | LDR Rd, [Rn, #<imm>] | 2 |
Halfword, immediate offset | LDRH Rd, [Rn, #<imm>] | 2 | |
Byte, immediate offset | LDRB Rd, [Rn, #<imm>] | 2 | |
Word, register offset | LDR Rd, [Rn, Rm] | 2 |
续表
操 作 | 描 述 | 汇 编 指 令 | 周 期 |
| Halfword, register offset | LDRH Rd, [Rn, Rm] | 2 |
Signed halfword, register offset | LDRSH Rd, [Rn, Rm] | 2 | |
Byte, register offset | LDRB Rd, [Rn, Rm] | 2 | |
Signed byte, register offset | LDRSB Rd, [Rn, Rm] | 2 | |
PC-relative | LDR Rd, <label> | 2 | |
SP-relative | LDR Rd, [SP, #<imm>] | 2 | |
Multiple, excluding base | LDM Rn!, {<loreglist>} | 1+N | |
Multiple, including base | LDM Rn, {<loreglist>} | 1+N | |
Store | Word, immediate offset | STR Rd, [Rn, #<imm>] | 2 |
Halfword, immediate offset | STRH Rd, [Rn, #<imm>] | 2 | |
Byte, immediate offset | STRB Rd, [Rn, #<imm>] | 2 | |
Word, register offset | STR Rd, [Rn, Rm] | 2 | |
| Halfword, register offset | STRH Rd, [Rn, Rm] | 2 |
Byte, register offset | STRB Rd, [Rn, Rm] | 2 | |
SP-relative | STR Rd, [SP, #<imm>] | 2 | |
Multiple | STM Rn!, {<loreglist>} | ||
Push | Push | PUSH {<loreglist>} | 1+N |
Push with link register | PUSH {<loreglist>, LR} | ||
Pop | Pop | POP {<loreglist>} | 1+N |
Pop and return | POP {<loreglist>, PC} | 4+N | |
Branch | Conditional | B<cc> <label> | 1或3 |
Unconditional | B<label> | 3 | |
With link | BL<label> | 4 | |
With exchange | BX Rm | 3 | |
With link and exchange | BLX Rm | 3 | |
Extend | Signed halfword to word | SXTH Rd, Rm | 1 |
Signed byte to word | SXTB Rd, Rm | 1 | |
Unsigned halfword | UXTH Rd, Rm | 1 | |
Unsigned byte | UXTB Rd, Rm | ||
Reverse | Bytes in word | REV Rd, Rm | 1 |
Bytes in both halfwords | REV16 Rd, Rm | 1 | |
Signed bottom half word | REVSH Rd, Rm | 1 | |
State change | Supervisor Call | SVC #<imm> | - |
Disable interrupts | CPSID i | 1 |
操 作 | 描 述 | 汇 编 指 令 | 周 期 |
| Enable interrupts | CPSIE i | 1 |
Read special register | MRS Rd, <specreg> | 4 | |
Write special register | MSR <specreg>, Rn | 4 | |
Breakpoint | BKPT #<imm> | — | |
Hint | Send event | SEV | 1 |
Wait for event | WFE | 2 | |
Wait for interrupt | WFI | 2 | |
Yield | YIELD | 1 | |
Hint | No operation | NOP | 1 |
Barriers | Instruction synchronization | ISB | 4 |
Data memory | DMB | 4 | |
Data synchronization | DSB | 4 |
ISO/IEC的C代码不能直接地获取一些Cortex-M0的指令。表7-23列举了CMSIS的C编译器中提供的部分内部函数用于产生这些指令。如果一个C编译器不支持恰当的内部函数,则需要用内嵌汇编来获取有关指令。
表7-23 CMSIS内部函数
指 令 | CMSIS内部函数 | 指 令 | CMSIS内部函数 |
CPSIE i | void __enable_irq(void) | REV | |
CPSID i | void __disable_irq(void) | REV16 | uint32_t __REV16(uint32_t int value) |
ISB | void __ISB(void) | REVSH | uint32_t __REVSH(uint32_t int value) |
DSB | void __DSB(void) | SEV | void __SEV(void) |
DMB | void __DMB(void) | WFE | void __WFE(void) |
NOP | void __NOP(void) | WFI | void __WFI(void) |
CMSIS也提供了几个函数用于获取特殊的寄存器,如表7-24所示。
表7-24 CMSIS提供的用于获取特殊寄存器的函数
特殊寄存器 | 获 取 方 式 | CMSIS函数 |
PRIMASK | 读 | uint32_t __get_PRIMASK(void) |
写 | void __set_PRIMASK(void) | |
CONTROL | 读 | Uint32_t __get_CONTROL(uint32_t value) |
写 | Void __set_CONTROL(uint32_t value) | |
MSP | 读 | Uint32_t __get_MSP(void) |
写 | Void __set_MSP(uint32_t TopOfMainStack) | |
PSP | 读 | Uint32_t __get_PSP(void) |
写 | Void __set_PSP(uint32_t TopOfMainStack) |