文章目录
ARM-专用指令(lv9-day9)
1 状态寄存器与传送指令 MRS读 MSR写),
在这部分我们关注的是CPSR的控制位(条件代码标志位的作用在这篇文章里有数据处理)
读MRS:
MRS R1,CPSR
@R1=CPSR
写MSR
MSR CSPR #0X10
ARM 上电CPSR默认为0x000000D3(11010011)
由上图可知此时ARM为SVC模式,为ARM状态 ,FIQ和IRQ禁止(禁止中断,优先初始系统)。
1.1小插曲
执行以下代码
MRS R1,CPSR
@将模式改为user模式
MSR CPSR,0x10
MSR CPSR,0xD3 //由于上面将模式更改为user模式(非特权模式)没有权限将模式更改为SCV模式
编译调试过程
2 软中断模式
首先来了解一下异常的相关概念。
2.1 异常的概念
2.2 ARM异常相应
2.2.1异常向量表
2.3 异常返回
SWI程序演示
@ 汇编
.text @表示为代码段
.global _start @将_strat定义为全局符号
_start: @ 汇编入口
@异常向量表(从0地址开始,这里不能写自己的程序)
B MAIN
B .@跳转自身
B SWI_HANDLER @0x08//软中断向量表位置
B .
B .
B .
B .
B .
MAIN:
@初始栈指针
MOV SP,#0X40000020@这句话不能写在下一句话的后面(因为SP寄存器每个模式下都由独立的一个)
MSR CPSR,#0x10
MOV R1,#1
MOV R2,#2
SWI #1
ADD R3,R2,R1
B stop
SWI_HANDLER:
@压栈
STMFD SP!,{R1,R2,LR}
MOV R1,#10
MOV R2,#20
SUB R3,R2,R1
@出栈
LDMFD SP!,{R1,R2,PC}^(^表示在出栈的同时把SPSR给CPSR)
@异常返回
MOV PC,LR
stop:
B stop
.end @汇编结束
程序调试过程
3协处理器指令
不同SOC的种类和数量是不同的,在嵌入式领域一般常用的是IPU,CP15
IPU:用于计算浮点数
CP15:用于管理寄存器(比如异常向量表,控制MMU等等)
协处理器数据数据运算指令(不同SOC由不同的指令,所以这里是以后我们可能遇到的)
比如 CDP
协处理器存储器运算指令
STC:将协处理器中的数据储存到储存器
LDC:将存储器中的数据读取到协处理器中
协处理器寄存器传回指令
MRC 将协处理器中寄存器的数据传送到ARM处理器中的寄存器
MCR 与上面相反
4伪指令
伪指令:本身不是指令,编译器可以将其替换成诺干条指令。
NOP:空指令(占用cpu资源)
LDR
这种格式是伪指令:LDR R1,=0x123456789
(可以将任意一个32位的数据放到寄存器中)
LDR R1,=STOP
(把STOP的地址给R1)
LDR R1, STOP
(将地址中的内容写入R1寄存器)
@ LDR R1,=STOP
LDR R1, STOP
STOP:
B STOP
这种是指令:LDR R1,[R2]