PAGE1
PAGE1
指令集与编程模型
指令集概述
ARMCortex-M3处理器使用的是Thumb-2指令集,这是一种混合指令集,结合了16位Thumb指令集和32位ARM指令集的优势。Thumb-2指令集在保持代码密度的同时,提供了高性能的特性,使得Cortex-M3处理器能够在嵌入式系统中高效运行。
Thumb-2指令集的特点
代码密度高:Thumb-2指令集通过使用16位和32位指令的混合,可以在大多数情况下生成比纯32位ARM指令集更紧凑的代码。
性能优越:尽管代码密度高,Thumb-2指令集仍然保持了高性能,特别是在关键路径和循环中。
兼容性好:Thumb-2指令集向下兼容Thumb指令集,可以在现有Thumb代码基础上进行优化和扩展。
可读性强:Thumb-2指令集的设计使得汇编代码更易读和理解。
指令集类型
16位Thumb指令:主要用于简单操作和控制流。
32位ARM指令:用于复杂操作和高性能计算。
编程模型
ARMCortex-M3处理器的编程模型包括了多个寄存器和状态寄存器,这些寄存器用于存储数据、地址和状态信息,是处理器执行指令的基础。
寄存器
通用寄存器:
R0-R12:16位或32位通用寄存器,用于存储数据和地址。
R13(SP):堆栈指针寄存器,用于管理堆栈。
R14(LR):链接寄存器,用于存储子程序返回地址。
R15(PC):程序计数器,指向当前执行的指令地址。
状态寄存器:
CPSR(CurrentProgramStatusRegister):当前程序状态寄存器,包含条件标志、中断禁止位、模式位等。
SPSR(SavedProgramStatusRegister):保存的程序状态寄存器,用于在异常处理过程中保存CPSR的内容。
特殊功能寄存器:
MSP(MainStackPointer):主堆栈指针。
PSP(ProcessStackPointer):进程堆栈指针。
PRIMASK:中断禁止寄存器,用于禁止高优先级中断。
FAULTMASK:故障禁止寄存器,用于禁止所有故障中断。
BASEPRI:基优先级寄存器,用于屏蔽低优先级中断。
CONTROL:控制寄存器,用于选择堆栈指针和特权模式。
寄存器使用示例
通用寄存器
;将R0的值加1,结果存回R0
ADDR0,R0,#1
;将R1的值复制到R2
MOVR2,R1
;将立即数10存入R3
LDRR3,=10
堆栈指针寄存器
;使用主堆栈指针(MSP)
PUSH{R0-R3,LR};将R0-R3和LR压入堆栈
POP{R0-R3,LR};从堆栈弹出R0-R3和LR
;使用进程堆栈指针(PSP)
PUSH{R0-R3,LR}!;将R0-R3和LR压入堆栈,并更新PSP
POP{R0-R3,LR}!;从堆栈弹出R0-R3和LR,并更新PSP
状态寄存器
CPSR
;读取CPSR并存入R0
MRSR0,CPSR
;将R0的值写入CPSR
MSRCPSR,R0
PRIMASK
;禁止高优先级中断
CPSIDi
;使能高优先级中断
CPSIEi
控制寄存器
CONTROL
;选择使用主堆栈指针(MSP)
LDRR0,=0x00;将0x00存入R0
MSRCONTROL,R0;将R0的值写入CONTROL寄存器
;选择使用进程堆栈指针(PSP)
LDRR0,=0x02;将0x02存入R0
MSRCONTROL,R0;将R0的值写入CONTROL寄存器
指令格式
Thumb-2指令集支持多种指令格式,包括16位和32位指令。这些指令格式的设计使得指令集更加灵活和高效。
16位指令格式
数据处理指令:
ADD:加法指令
SUB:减法指令
MOV:移动指令
控制转移指令:
B:分支指令
BL:带链接的分支指令
加载/存储指令:
LDR:加载指令
STR:存储指令
16位指令示例
;将R1的值加1,结果存回R1
ADDR1,R1,#1
;将R2的值减2,结果存回R2
SUBR2,R2,#2
;将立即数