目录
一、状态寄存器传送指令:访问(读写)CPSR寄存器 编辑
二、软中断指令:触发软中断
三、协处理器指令:操控协处理器的指令
四、伪指令:
一、状态寄存器传送指令:访问(读写)CPSR寄存器
CPSR寄存器分为四个域,[31:24]为条件域用F表示、[23:16]为状态域用S表示、[15:8]为预留域用X表示、[8:0]为控制域用C表示
Bit[4:0]
[10000]User [10001]FIQ [10010]IRQ [10011]SVC[10111]Abort [11011]Undef [11111]System [10110]Monitor
Bit[5]
[0]ARM状态 [1]Thumb状态Bit[6]
[0]开启FIQ [1]禁止FIQBit[7]
[0]开启IRQ [1]禁止IRQBit[28]
> 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0> 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1
Bit[29]
> 当运算器中进行加法运算且产生进位时该位自动置1,否则为0> 当运算器中进行减法运算且产生借位时该位自动置0,否则为1
Bit[30]
当运算器中产生了0的结果该位自动置1,否则为0Bit[31]
当运算器中产生了负数的结果该位自动置1,否则为0
————————————————
版权声明:本文为CSDN博主「宇努力学习」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_52479948/article/details/128352512
@ 读CPSR
@ MRS R1, CPSR
@ R1 = CPSR
@ 写CPSR
@ MSR CPSR, #0x10
@ CPSR = 0x10
@ 在USER模式下不能随意修改CPSR,因为USER模式属于非特权模式
@ MSR CPSR, #0xD3
二、软中断指令:触发软中断
ARM寄存器组织与异常处理_宇努力学习的博客-CSDN博客
当产生软中断后CPU会将IRQ自动禁止
压栈时压的是LR出栈直接将这个值出给PC实现PC=LR,在出栈程序后加^相当于CPSR=SPSR
.text
.global _start
_start:@ 异常向量表
B MAIN
B .
B SWI_HANDLER
B .
B .
B .
B .
B .@ 应用程序
MAIN:
MOV SP, #0x40000020
@ 初始化SVC模式下的栈指针
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
.end
三、协处理器指令:操控协处理器的指令
ARM最多可以有16个协处理器,常见的有:FPU(专门用来进行浮点运算)、CP15(内存管理:高速缓存、异常向量表、控制MMU)
浮点处理单元_百度百科
内存管理单元(MMU)和协处理器CP15介绍(转) - 走看看
ARM协处理器CP15介绍_Leon_George的博客-CSDN博客_arm cp15
MMU_百度百科
Linux上每个进程都有4个G的虚拟内存。
@ 1.协处理器数据运算指令
@ CDP
@ 2.协处理器存储器访问指令
@ STC 将协处理器中的数据写入到存储器
@ LDC 将存储器中的数据读取到协处理器
@ 3.协处理器寄存器传送指令
@ MRC 将协处理器中寄存器中的数据传送到ARM处理器中的寄存器
@ MCR 将ARM处理器中寄存器中的数据传送到协处理器中的寄存器
@ *****************************************************************
四、伪指令:
本身不是指令,编译器可以将其替换成若干条等效指令
@ 空指令
@ NOP
@ 指令
@ LDR R1, [R2]
@ 将R2指向的内存空间中的数据读取到R1寄存器
@ 伪指令
@ LDR R1, =0x12345678
@ R1 = 0x12345678
@ LDR伪指令可以将任意一个32位的数据放到一个寄存器
换成将PC中的地址给R1,PC这时应该是目前指令+8的位置,所以在0X08这个位置放了0X12345678
@ LDR R1, =STOP
@ 将STOP表示的地址写入R1寄存器
@ LDR R1, STOP
@ 将STOP地址中的内容写入R1寄存器