写RTOS必备的汇编指令详解
IMPORT关键字
IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。
LDR指令
LDR指令的作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。
LDR指令的格式:
LDR{条件} 目的寄存器 <存储器地址>
LDR指令的寻址方式比较灵活,只描述需要使用的格式:
LDR R0,=0xE000ED04
将立即数0xE000ED04设置到R0寄存器中去
LDR R0, =label
将label的绝对地址地址写入R0寄存器
STR指令
STR指令的作用:STR指令用于从源寄存器中将一个32位的字数据传送到存储器中.
STR指令的格式为:
STR{条件} 源寄存器,<存储器地址>
STR R0,[R1]
将寄存器R0中的字节数据写入以R1为地址的存储器中。
MRS指令
MRS指令的作用:将特殊寄存器的内容传送至通用寄存器。
MRS指令的格式为:
MRS{<条件码>}Rd,CPSR}SPSR
MRS R0, PSP
将PSP寄存器的值读取到R0寄存器中去
MSR指令
MSR指令的作用:将通用寄存器的内容传送至特殊寄存器。
MSR指令的格式为:
MSR{<条件码>}Rd,CPSR}SPSR
MSR PSP,R0
将R0寄存器的值读取到PSP寄存器中去
CBZ指令
CBZ指令的作用是: 比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
CBZ指令的格式为
CBZ Rn, label
CBZ R0, label
如果R0寄存器的值为0 ,那就跳转到label位置执行,如果不为0就继续执行下一句代码
ORR指令
ORR指令的作用: ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。
ORR指令的格式为:
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR LR, LR, #0x04
将LR寄存器的值或上0x04,再将获得的值写入LR寄存器,
BX指令
BX指令的作用:BX指令是ARM指令系统中的带状态切换跳转指令。BX指令跳转到指令中所指定的目标地址,若目标地址的bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址的代码解释为ARM代码;若目标地址的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码。
BX 指令的格式为:
BX{条件} 目标地址
BX LR
跳转至LR寄存器所在地址执行。
STMDB指令
stm: (store much)多数据存储,将寄存器的值存到地址上
stmdb(地址先减而后完成操作) stmfd(满递减堆栈);
STMDB R0!, {R4-R11}
将依次压入R4-R11的值存入R0所存地址处的数据, 先减地址,再压入数据。
LDMIA指令
ldm: (load much)多数据加载,将地址上的值加载到寄存器上
ldmia 完成操作而后地址递增
LDMIA R0!, {R4-R11}
将R0所在地址的数据依次恢复到R4-R11中,先赋值,在加地址
stmdb和ldmia指令一般配对使用,stmdb用于将寄存器存到某个地址上(一般是栈地址),ldmia用于将地址上