伪指令
AREA指令
DCB DCD指令
B跳转指令
在ARM程序中有两种方法可以实现程序流程的跳转:
1,直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用
MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
2,使用跳转指令。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:
1,B 跳转指令
2,BL 带返回的跳转指令
3,BLX 带返回和状态切换的跳转指令
4,BX 带状态切换的跳转指令
CPSID CPSIE 快速的开关中断指令
CPSID CPSIE 用于快速的开关中断。UCOSII中在
指令 | 参数 | 寄存器值 | 行为 |
---|---|---|---|
CPSID | I | PRIMASK=1, | ;关中断 |
CPSIE | I | PRIMASK=0, | ;开中断 |
CPSID | F | FAULTMASK=1, | ;关异常 |
CPSIE | F | FAULTMASK=0, | ;开异常 |
注:I:IRQ ; F:FIQ。在Cortex内核中没有FIQ中断,都按IRQ处理。
指令示例:
临界代码函数:
OS_CPU_SR_Save
MRS R0, PRIMASK ;读取primask到R0,R0为返回值
CPSID I ;PRIMASK=1,关中断
BX LR ;返回
LDR STR数据传输指令
Cortex内核用的比较多的是伪指令方式,虽然LDR伪指令和ARM的LDR指令很像,但是作用不太一样。LDR伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如: ldr r0, =0x12345678 这样,就把0x12345678这个地址写到r0中了,而不是0x12345678地址所存储的值。
例如:
LDR R1,=COUNT ;这条伪指令,是将COUNT的地址赋给R1
LDR R0,[R1] ;将COUNT的值赋给R0
其他详细用法见下链接。
MRS与MSR指令
a,MRS Move to Register from State register
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。
使用格式:
MRS{条件} 通用寄存器,特殊功能寄存器(Cortex内核中是PRIMASK或FAULTMASK,其他内核通常为CPSR或SPSR;当条件为空的时候语句无条件执行)
该指令一般用在以下情况:
I.当需要改变程序状态寄存器的内容时,通常使用:读取-修改-写回的步骤,MRS指令用于将程序状态寄存器的内容读取到通用寄存器中,然后更改。
II.当在异常处理戒迕程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄
存器的值,然后保存。
指令示例:
临界代码段使用的函数
OS_CPU_SR_Save
MRS R0, PRIMASK ;读取primask到R0,R0为返回值
CPSID I ;PRIMASK=1,关中断。
BX LR ;·
b,MSR Move from State registerto Register
MRS指令用于将通用寄存器的内容读取到特殊功能寄存器中。
该指令一般用在以下情况:
I.当需要改变特殊功能寄存器的内容时,通常使用:读取-修改-写回的步骤,MSR指令可以把通用寄存器的值写回到特殊功能寄存器。
II.当退出异常中断处理器程序时,如果事先保存了特殊功能寄存器的内容通常通过MSR指令将事先保存的特殊功能寄存器内容恢复到特殊功能寄存器中。
指令示例:
临界代码段使用的函数
OS_CPU_SR_Restore
MSR PRIMASK, R0 ;把R0的参数读取到primask寄存器中
BX LR ;