写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用于将地址上

posted @ 2022-05-08 20:08  大高玩子  阅读(966)  评论(0编辑  收藏  举报