ARM STM32任务切换相关汇编指令介绍
MOV
数据传送指令,将8位立即数或寄存器传送到目标寄存器
举例:MOV R4,#0x07 //R4 = 0x07
MOV R0,R6 //R0 = R6
MOV PC,LR //PC = LR,子程序返回
PUSH/POP
寄存器入栈/出栈指令
举例:PUSH {R4-R6,LR} //保存R4,R5,R6,LR的值到内存的栈中,LR:连接返回寄存器,保留函数返回后,下一条应执行的指令
POP {R4-R6,PC} //出栈,恢复R4,R5,R6,PC = LR
STR
存储数据(字)到指定地址的存储单元,要存储的数据在前
举例:STR R5,[R6,#0] //将R5的数据存储到R6+0存储单元
STRB
存储数据(字节)到指定地址的存储单元,要存储的数据在前,低字节有效,高24位清零
举例:STRB R5,[R6,#0] //将R5的数据的低8位存储到R6+0存储单元
STRH
存储数据(半字)到指定地址的存储单元,要存储的数据在前,低半字有效,高16位清零
举例:STRH R5,[R6,#0] //将R5的数据的低16位存储到R6+0存储单元
LDR
加载指定送至上的数据(字),放入寄存器中,要加载的数据在后
举例:LDR R1,[R0,#24] //将R0+24地址处的数据存储到R1中
LDRB
加载指定送至上的数据(字节),放入寄存器中,要加载的数据在后
举例:LDRB R1,[R0,#24] //将R0+24地址处的数据低8位存储到R1中
LDRH
加载指定送至上的数据(半字),放入寄存器中,要加载的数据在后
举例:LDRH R1,[R0,#24] //将R0+24地址处的数据低16位存储到R1中
LDM
批量加载指令,加载多个寄存器,可以实现在一组寄存器和一块连续的内存单元之间传输数据
举例:LDM R0,{R4-R11} //R0指向的前8个字赋值给R4-R11
STM
批量存储指令,存储多个寄存器,可以实现在一组寄存器和一块连续的内存单元之间传输数据
举例:STM R0,{R4-R11} // R4-R11赋值给R0指向的前8个字
ADD
加法运算
举例:ADD R0,R0,#0x20 //R0 = R0 + 0x20
ORR
异或运算
举例:ORR LR,LR,#0x04 // LR = LR^0x04
SUB
减法运算指令
举例:SUB R0,R2,R1 //R0 = R2-R1
SUB R0,R2,#1 //R0 = R2-1
SUB R0,#250 //R0 = R0-250
SUBS
减法运算指令
举例:SUBS R0,R0,#4 //R0 = R0 - 4,置位CPSR的C标志位
MRS
举例:MRS R0, PSP //读PSP值到R0
MRS R0, PRIMASK //读PRIMASK的值到R0,PRIMASK 用于禁止除NMI和HardFalut外的所有异常和中断
MSR
举例:MSR PSP, R0 //设置PSP = R0
MSR PRIMASK, R0 //恢复PRIMASK的值
CPSID
举例:CPSID I //关总中断
CPSIE
举例:CPSIE I //开总中断
BX
跳转指令
举例:BX LR //跳转到LR地址
SVC
SVC异常服务
举例:SVC 0 //产生SVC异常服务,svc number = 0
TST/ ITE/ MRSEQ/ MRSNE
条件判断
举例:TST LR,#0x04 //LR&0x04
ITE EQ //条件判断,是否等于0
MRSEQ R0,MSP //等于0,则R0 = MSP
MRSNE R0,PSP //不等于0,则R0 = PSP
CBZ
条件跳转
举例:CBZ R0,SVC_HANDLER_0 //如果R0 = 0,跳转到SVC_HANDLER_0