关键词:
1.MSR和MRS指令介绍
MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。
MSR指令: 对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
2.CPSR 程序状态寄存器(current program status register)
如图所示,ARM每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,叫做 当前程序状态寄存器
CPSR寄存器格式:
在CPSR寄存器中主要用到了控制位,每个标志位如下图所示:
3.使用MSR指令写入数据
例:
msr cpsr_c, #0xd2 @0xd2=1100 0010//禁止中断使能,进入中断模式 msr cpsr_c, #0x53 @0x53=0101 0011//开IRQ中断,禁止FIQ中断,进入ARM状态,设为管理(svc32)模式
其中cpsr_c是因为CPSR有4个8位区域:
- C 控制域屏蔽字节([7:0])
- X 扩展域屏蔽字节([15:8])
- S 状态域屏蔽字节([23:16])
- F 标志域屏蔽字节([31:24])
所以cpsr_c表示的是CPSR控制位、
4.使用MRS和MSR来设置2440位管理模式,实例:
mrs r0,cpsr //读状态寄存器cpsr的数据到r0中 bic r0,r0,#0x1f //对r0低5位进行清0,清除模式位 orr r0,r0,#0xd3 //低8位或(110 10011), 设为管理(svc32)模式,禁止IRQ和FIQ中断 msr cpsr,r0 //写入状态寄存器cpsr,更新。
5.SPSR程序保存状态寄存器(saved program status register)
SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。
(注意:用户user模式和系统system模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。)
在异常模式返回时,如果指令带有S后缀(除了比较指令以外),同时又以PC为目标寄存器进行操作,则操作的同时从SPSR恢复CPSR。以下都是可以恢复CPSR寄存器
例如:
movs pc, #0xff // cpsr = spsr; pc = 0xff adds pc, r1, #0xffffff00 //cpsr = spsr; pc = r1 + 0xffffff00 ands pc, r1, r2 //cpsr = spsr; pc = r1 & r2; ldmia sp!, { r0-r12,pc }^ //中断返回, ^表示将spsr的值复制到cpsr
令状态寄存器访问指令(mrs,msr)(代码片段)
ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器。每个位的含义如下图: 分成了4部分:1,条件标志位N(Negative),Z(Zero),C(Carry),V(Verflow)统称为条件标志位... 查看详情
设置svc模式
清0:bic置1:orr访问cpsr和spdr要用到mrs和msr指令mrs是把状态寄存器的值赋给通用寄存器msr是把通用寄存器的值赋给状态寄存器 1.text2.global_start3_start:4breset5ldrpc,_undefined_instruction6ldrpc,_software_interrupt7ldrpc,_prefetch_abort8ldrpc,_d 查看详情
嵌入式:交换指令之swp,mrs,msr
存储器与寄存器交换指令(SWP)交换指令把字或无符号字节的读取和存储组合在了一条指令中。这种组合指令通常用于不能被外部其他存储器访问(如:DMA访问)打断的存储器操作。一般用于处理器之间或处理器与DMA控制器之间... 查看详情
MSR CPSR_C,#0x13 不能使用 ARM 程序集?
...无操作系统)。我需要读取一个只能在主管模式下访问的寄存器(多处理器关联寄存器,MPIDR)。当我处于用户模式并尝试使用调试器逐步执行以下指令(进入超级用户模式)时,没有任 查看详情
arm汇编指令
...r0,存入r02.比较指令cmp指令:cmpr0,r1@根据r0-r1值判断状态寄存器(cpsr寄存器)tst指令:tstr0,#0b1001@按位与的值判断状态寄存器(cpsr寄存器)3.跳转指令b指令:blabel@直接跳转bgtlabel1@大于跳转beq@等于跳转bl指令:blfunc@调用函数跳转... 查看详情
arm指令
...●协处理器指令:CDP、LDC、STC、MCR、MRCARM指令寻址方式:寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、基址变址寻址、相对寻址、多寄存器寻址、堆栈寻址堆栈寻址与多寄存器寻址对照:参考:https://blog.csdn.net/yu... 查看详情
arm指令和thumb指令有啥区别
...件的转移。 数据处理指令 数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3个寄存器中。数据处理操作比ARM状态的更少,访问寄存器R8~R15受到一定限制。... 查看详情
arm指令集
...标志位。 !后缀: 使用!后缀后,那么基址寄存器的值在操作完成后将会改变(后索引寻址方式除外,因为后索引寻址的基址寄存 查看详情
cpsr和spsr中各个位的含义
N:负数标志位。如果目标寄存器中的有符号数为负数,则N=1,否则N=0。Z:零标志位。如果目标寄存器中的数为0,则N=1,否则N=1。C:进位标志位。有以下3种情况 1、无符号加法运算和CMN指令,如果产生进位,则C=1,... 查看详情
windowsssdt(代码片段)
...xx方式相比速度更快,因为sysenter指令大量的使用了MSR寄存器存储跳转地址等。MSR寄存器相关读/写命令//读取msr寄存器rdmsrxxxx//写入msr寄存器wrmsrxxxx其中xxx是msr寄存器的编号比如174h等为方便记忆我们约定了一些编号的名字IA32_S... 查看详情
arm指令集——跳转指令
...条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。在数据处理指令中使用S后缀来实现该功能。 不要在CMP,CMN,TST或者TEQ指令中使用S后缀。这些比较指令总是会更新标志位。 在Thumb模式下,... 查看详情
)嵌入式linux之常用汇编指令(代码片段)
1.处理器内部数据传输指令数据传输指令分为一般寄存器间的数据传输或者特殊寄存器与一般寄存器间的数据传输。数据传输常用的指令有三个:MOV、MRS和MSR 用法示例:1、MOV指令MOVR0,R1@将寄存器R1中的数据传递... 查看详情
)嵌入式linux之常用汇编指令(代码片段)
1.处理器内部数据传输指令数据传输指令分为一般寄存器间的数据传输或者特殊寄存器与一般寄存器间的数据传输。数据传输常用的指令有三个:MOV、MRS和MSR 用法示例:1、MOV指令MOVR0,R1@将寄存器R1中的数据传递... 查看详情
arm64指令小记(代码片段)
1状态寄存器CPSRARM64下,该寄存器为32位,高4位N、Z、C、V均为条件码标志位。SUBS和ADDS影响CPSR,而SUB和ADD则不影响2TEST属于逻辑运算指令,做与操作,结果影响CPSR如果与运算结果为0那么Z标志位为1,反之为0... 查看详情
arm64指令小记(代码片段)
1状态寄存器CPSRARM64下,该寄存器为32位,高4位N、Z、C、V均为条件码标志位。SUBS和ADDS影响CPSR,而SUB和ADD则不影响2TEST属于逻辑运算指令,做与操作,结果影响CPSR如果与运算结果为0那么Z标志位为1,反之为0... 查看详情
与基于51系列与基于arm处理器的控制系统开发有何异同。
...序调用、异常中断和软件中断有何异同。(从应用场合、寄存器保护、地址的保护与返回和工作模式等方面比较)ARM中子程序调用是用跳转指令B、BL或BX,跳转到程序计数器PC的指向处,产生程序分支。正常的子程序调用属于用... 查看详情
汇编指令(代码片段)
...标志位@eg:使能中断和快速中断@mrsr0,cpsr//对cpsr操作需要以寄存器为中介@bicr0,r0,#0xc0//I-6,F-7,使能,将6?7位清零@msrcpsr,r0@eg:判断当前工作状态位ARM状态,是则切换到user工作模式?@mrsr0,cpsr@tstr0,#0x20//5号位-1-Thumb状态,0-ARM状态@andeqr0,#... 查看详情
tstcmpbnebeq指令
1、tst:逻辑处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。当前运算结果为1,则Z=0;当前运算结果为0,则Z=1 cmp:算数处理指令,用于把一... 查看详情