FreeRTOS中汇编指令

本文详细介绍了ARM汇编语言中的关键指令,包括LDR和STR的内存与寄存器数据传输,MSR用于修改控制寄存器,LDMIA和STMDB的多寄存器加载和存储,以及CPS指令用于切换处理器状态。此外,还提到了数据同步和隔离指令如DMB, DSB, ISB,以及系统调用SVC和无操作NOP。这些指令在嵌入式系统和底层程序设计中起到重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编程序前要加PRESERVE8

require8和preserve8c和汇编有8位对齐的要求,这两个伪指令能够满意此要求

LDR和MOV

LDR Rn, label1

LDR指令负责将label1所代表的存储器中数据搬移到内部寄存器Rn中。指令使用方式有:

LDR R0,[R1] ;

R1中代表存储器地址,在存储器中将R1地址处的数据加载到寄存器R0中。

LDR R0,=0x00000040 ;

将立即数装入R0中,如果立即数小,该指令等效 MOV R0,#64,如果立即数很大比如占据32bit,那么该指令将变成伪指令,见下条。

LDR R0,=0xF0000000 ;

立即数很大,无法将立即数和指令合并成32bit,指令会被编译器拆分为LDR R0, [PC, #offset]; .word 0xF00000000两条指令,即先将立即数利用.word指令存储在该LDR指令附近,编译器计算立即数与当前正在执行指令PC(program counter)指针的偏差offset,注意ARM是流水线指令,采用取指令,译指令和执行指令。

LDR R0,label;

将label标号所代表的寄存器地址中数据装在到R0。

STR

STR{条件}  源寄存器,<存储器地址>
STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常
用,丏寻址方式灵活多样,使用方式可参考指令LDR。

指令示例:
STR R0,[R1],#8             ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8]             ;将R0中的字数据写入以R1+8为地址的存储器中。”

MSR

MRS R0,CPSR     ;        读取CPSR
BIC R0,R0,#0x1F ;        修改,去除当前处理器模式
ORR R0,R0,#0x13 ;        修改,设置特权模式
MSR CPSR_c, R0  ;        写回,仅仅修改CPSR中的控制位域

ldmia与stmdb

ldmia r0!, {r4-r11, r14}  的意思是

LDMIA 中的 I 是 increase 的缩写,A 是 after 的缩写,LD加载(load)的意思
R0后面的感叹号“!表示会自动调节 R0里面的指针
所以整句话意思是任务栈R0的存储地址由低到高,将R0存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里

还有一种是STMDB R1!, {R0,R4-R12} 这就和上面反过来了,ST是存储(store)的意思,D是decrease的意思,B是before的意思,整句话就是R1的存储地址由高到低递减,将R0,R4-R12里的内容存储到R1任务栈里面。

stmdb:db(decrease before)表示先减后存。

指令 stmdb sp!, { fp, ip, lr, pc}  %% "!”表示sp等于最终被修改的sp的值。

假设 sp=4096,此条指令的执行过程如下:

1.先减:sp=sp-4=4092;

2.后存:4092-4095处存放pc的值;

3.先减:sp=sp-4=4088;

4.后存:4088-4091处存放lr寄存器的值;

以此类推,..........。

ldmia:ia(increase after)表示先读后增。

指令ldmia sp, {fp,sp, pc}

假设 sp=4080,此条指令的执行过程如下:

1.先读:fp位于4080-4083处存放原来保存的fp;

2.后增:sp=sp+4=4084;

3.先读:sp位于4084-4087处存放原来保存的ip;

4.后增:sp=sp+4;

cps

cpsie i        开启IQR中断,cpsid是关闭
cpsie f        开启FQR中断(快速中断),cpsid是关闭
dsb             
isb

指令名

功能描述

DMB

数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作

都执行完毕后,才提交(commit)在它后面的存储器访问操作。

DSB

数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作

都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)

ISB

指令同步隔离。最严格:它会清洗流水线以保证所有它前面的指令都执

行完毕之后,才执行它后面的指令。

svc

/* 调用 SVC 去启动第一个任务 */
svc 0

nop

空操作

ORR

ORR指令的格式为: ORR{条件}{S}  目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。

操作数1应是一 个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

操作数2为32位的掩码,如果在掩码中置了某一位1,则将这一位置1。未设置的掩码位保持不变。

B BL BX BLX

(1) B 跳转指令

(2) BL 带返回的跳转指令

(3) BLX 带返回和状态切换的跳转指令

(4) BX 带状态切换的跳转指令

X 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。因此可以将处理器的工作状态有ARM 状态切换到Thumb 状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值