目录
一、状态寄存器传送指令
读CPSR:
@读CPRS
MRS R1 , CPSR @ R1 =CPRS
写CPSR:
@写CPRS
MRS CPSR,#0x10
将CPSR改成usr模式,ARM状态、开启IRQ、FIQ
[7:0] 分别为00010000转换成16进制为0x10
CPSR 更改为USR模式后,无法将CPSR写成0xD3 SVC模式(0x000000D3转换成二进制的值为11010011),因为USR非特权模式,权限低不能随意修改核心的东西
MRS CPSR,#0x10
MRS CPSR,#0xD3
二、软中断指令SWI
ARM异常相应的动作:ARM异常处理_lumijgfei2_0的博客-优快云博客
CPU遇到软中断SWI(linux内核调用中用的较多),由USR模式切换到SVC 模式
@ 异常向量表:腾出异常向量表的32位(8个)空间(0-31地址都是异常向量表(32个字节)使用的)
B MAIN
B .
B SWI_HANDLER 软中断的异常向量地址是0x00000008,是此处
B .
B .
B .
B .
B .
@ 应用程序:不能占用异常向量表的空间,异常向量表的空间是32位
@ MAIN:
MOV SP, #0x40000020
@ 初始化SVC模式下的栈指针,要写在切换成USER模式前,因为此时的SP还是SVC模式下的SP
MSR CPSR, #0x10
@ 切换成USER模式,开启FIQ、IRQ
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}^
@ 出栈恢复现场
@ 将压入到栈中的LR(返回地址)出栈给PC,实现程序的返回,这种写法注意一下
@ ‘^’表示出栈的同时将SPSR的值传递给CPSR,实现CPU状态的恢复(模式的恢复)
STOP
B STOP
三、协处理器指令
协处理器:ARM能处理的指令比如加减乘,交给ARM处理器处理,ARM不能处理的指令如图像运算,交给协处理器。ARM最多加16个协处理器。
FPU:帮助ARM运算浮点型数据的协处理器。
CP15:帮助ARM管理存储器的协处理器,高速缓存,异常向量表,MMU负责物理地址虚拟地址的映射。
协处理器指令:用于控制和操作协处理器的指令。
1.协处理器数据运算指令:CDP
2.协处理器存储器访问指令
STC 将协处理器中的数据写入到存储器
LDC 将存储器中的数据读取到协处理器
3.协处理器寄存器传送指令
MRC 将协处理器中寄存器中的数据传送到ARM处理器中的寄存器
MCR 将ARM处理器中寄存器中的数据传送到协处理器中的寄存器
四、伪指令
伪指令
:伪指令不是CPU可以直接执行的指令,编译器可以将其替换成若干个能执行的指令。比如,除法在ARM中不是指令,但能被替换成若干个指令
@ 空指令:本质是消耗CPU一定的时间,CPU是不可能会停下的,相当于执行了类似MOV R0, R0,把自己搬移给自己(等于没有执行,但消耗了CPU一定时间)
NOP @MOV R0,R0
@ 指令
LDR R1, [R2]
@ 将R2指向的内存空间中的数据读取到R1寄存器
@ 伪指令
LDR R1, =0x12345678
@ R1 = 0x12345678
@ LDR伪指令可以将任意一个32位的数据放到一个寄存器,与MOV不同MOV只能搬移立即数
LDR R1, =STOP
@ 将STOP表示的地址写入R1寄存器
LDR R1, STOP
@ 将STOP地址中的内容写入R1寄存器