ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。
针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器。每个位的含义如下图:
分成了4部分:
1,条件标志位
N(Negative), Z(Zero), C(Carry), V(Verflow)统称为条件标志位。ARM指令可以根据CPSR中的这些条件标志位来选择性的执行。
2,Q标志位
ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位。主要用于指示增强的DSP指令是否发生了溢出。
3,控制位
I, F, T以及M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
下表示控制位M[4:0]的含义:
M[4:0] |
处理器模式 |
可访问的寄存器 |
0b10000 |
用户模式 |
PC,CPSR, R14~R0 |
0b10001 |
FIQ模式 |
PC,CPSR, SPSR_fiq,R14_fiq,R8_fiq, R7~R0 |
0b10010 |
IRQ模式 |
PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0 |
0b10011 |
管理模式 |
PC,CPSR, SPSR_svc,R14_svc,R13_svc,R12~R0 |
0b10111 |
中止模式 |
PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0 |
0b11011 |
未定义模式 |
PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0 |
0b11111 |
系统模式 |
PC,CPSR(ARMv4及以上版本), R14~R0 |
4,保留位
用于将来ARM版本的扩展。
状态寄存器访问指令仅有两天:
MRS: 状态寄存器到通用寄存器的传送指令。
MSR: 通用寄存器到状态寄存器的传送指令。
MRS指令介绍
MRS的指令编码格式:
指令的语法格式:
MRS{<cond>}<Rd>, CPSR
MRS{<cond>}<Rd>, SPSR
其中:
<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<Rd>为目标寄存器。
指令操作的伪代码:
if ConditionPassed(cond) then if R == 1 then Rd = SPSR else Rd = CPSR
MSR指令使用的场合:
- 通常通过“读取-修改-写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中。
- 当异常允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,在用其他指令将SPSR值保存起来。
- 在进程切换时也需要保存当前状态寄存器的值。
MSR指令介绍
MRS的指令编码格式:
这里分为两种格式,一种是原操作数为通用寄存器, 另一种是源操作数是立即数。
指令的语法格式:
MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm> MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
其中:
<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<fields>设置状态寄存器中需要操作的位。状态寄存器的32位可以分为4个8位的域:
f: 指示bits[31 : 24],又名条件标志位域
s: 指示bits[23 : 16],又名状态标志位域
x: 指示bits[15 : 8], 又名扩展位域
c: 指示bits[7 : 0],又名控制位
<immediate>为将要传送到状态寄存器中的立即数,该立即数的计算方式可以去照看<ARM+Architecture+Reference+Manual.pdf>
<Rm>寄存器包含将要传送到状态寄存器中的数据。
指令的操作伪代码:
指令的使用:
MSR指令通常用于恢复状态寄存器的内容或者改变寄存器的内容。
当退出异常中断处理器程序时,如果事先保存了状态寄存器的内容通常通过MSR指令将事先保存的状态寄存器内容恢复到状态寄存器中。
当需要修改状态寄存器的内容时,通过“读取-修改-写回”指令序列完成。写回操作也是通过MSR指令完成的。
处理器切换到特权模式,使用将要修改某个位域的示例:
mrs r0, cpsr ;读取cpsr中的值 bic r0, r0, #0x1F ;修改,去除当前处理器模式 orr r0, r0, #0x13 ;修改,设置特权模式 msr cpsr_c, r0 ;写回,仅仅修改CPRS中的控制位
当进程切换到应用场合,应指定SPSR_fsxc来完全恢复。
相关推荐
在编写汇编程序时,开发者必须参考Cortex-M0的官方技术参考手册(Technical Reference Manual),以获取每条指令的精确时序、周期数以及对状态寄存器的影响。手册中的指令集详细描述每条指令的功能、格式和使用示例...
**MSR指令**:与MRS相反,MSR指令用于将通用寄存器或立即数的内容写入CPSR或SPSR的特定域中。CPSR和SPSR被划分为四个域:条件标志位域(f)、状态位域(s)、扩展位域(x)、控制位域(c),分别对应位[31:24]、[23:...
5. **处理器状态控制**:如MRS(Move to Register from Status)和MSR(Move to Status from Register),它们用于读取或设置处理器的状态标志,如条件码寄存器。 在实际编程中,理解寄存器布局也是关键。例如,R0-...
PSR是保存处理器当前状态的寄存器,如`MRS`(从PSR到寄存器)和`MSR`(从寄存器到PSR)指令,用于读取和修改处理器状态,例如条件码标志、处理器模式等,对程序的控制流有直接影响。 4. **加载/存储指令**: `LDR...
包括软件中断指令SWI,寄存器状态复制指令MRS和MSR。 11. ARM伪指令: 为方便编程,ARM汇编语言提供了一系列伪指令,包括地址读取指令ADR、ADRL,数据加载指令LDR,以及空操作指令NOP。 12. Thumb指令集: 这是一...
6. 系统控制指令:如`MRS`和`MSR`,用于读取和修改处理器状态寄存器,`SWI`用于执行操作系统服务。 接下来,我们要讨论的是ARM处理器的寄存器。ARM架构通常有多个通用寄存器(R0-R15),其中R13通常用作堆栈指针,...
`MRS`和`MSR`指令用于读取和设置处理器状态寄存器(CPSR或SPSR),这在改变处理器工作模式或者处理中断时非常有用。 **7. 多媒体和向量扩展** ARM9支持Thumb和Thumb-2技术,提供了一组高效的16位指令集,以减少代码...
5. **系统控制指令**:这些指令涉及处理器状态的修改,如MRS和MSR用于读写系统寄存器,MOV用于移动寄存器值,MVC用于内存到内存的拷贝。 6. **其他指令**:还包括向量处理(如NEON)、协处理器操作、异常处理、中断...
6. **状态和控制指令**:如`MRS`和`MSR`,用于读取和修改处理器的状态寄存器,如程序计数器(PC)、状态寄存器(CPSR)等。 了解了基本的指令集后,我们转向ARM汇编语言。汇编语言是一种低级编程语言,每条指令直接...
5. 程序状态控制指令:改变处理器的状态,如MRS、MSR等。 6. 转移指令:用于跳转到程序的其他部分,如BX、BLX等。 7. 带符号扩展和无符号扩展指令:如SXTB、UXTB等,用于将字节数据转换为半字或字。 二、常用指令...
- **处理器状态和控制指令**:如改变条件码(MRS, MSR)、改变处理器模式(MSR CPSR_f, #xxx)。 - **浮点运算指令**:对于支持VFP(Vector Floating Point)的ARM处理器,有专门的浮点运算指令。 3. **寄存器**...
- `MRS`, `MSR`: 读取和设置处理器状态寄存器。 7. **浮点运算(如果有支持)** - `VFMA`, `VFMS`: 浮点向量加法和减法。 - `VADD`: 单精度和双精度浮点数加法。 - `VMUL`: 浮点数乘法。 - `VMOV`: 浮点数到...
1. MRS:从状态寄存器中读取信息。 2. MSR:向状态寄存器写入信息。 3. SWI:软件中断,用于调用操作系统服务。 七、寄存器组织 ARM处理器有多个通用寄存器,如R0到R15,其中R13通常作为堆栈指针,R14作为链接...
5. 处理器状态切换:如MSR(修改状态寄存器)、MRS(读取状态寄存器)用于切换处理器工作模式和配置状态寄存器。 6. 存储访问指令:如LDR(加载)和STR(存储)用于从内存加载数据到寄存器或把寄存器数据存储到内存...
5. **处理器控制指令**:如MRS(Move Register from Status,从状态寄存器到通用寄存器)、MSR(Move Status to Register,将通用寄存器的内容到状态寄存器)等,用于读取或设置处理器的状态。 在实际开发中,...
5. **其他指令**:还包括一些特殊用途的指令,如MRS(从状态寄存器移动到通用寄存器)、MSR(从通用寄存器移动到状态寄存器),用于控制处理器状态;以及MCR、MRC(通用寄存器到协处理器寄存器,反之亦然)用于与协...
- **MRS**、**MSR**:从/到状态寄存器的转移。 ### Thumb指令集 Thumb指令集是ARM指令集的一个精简版本,用于节省代码空间。它有类似的寻址方式和指令,但格式和操作略有不同。 1. **Thumb存储器访问**: - **...
指令如MRS和MSR用于读取和设置PSR的内容,帮助程序员控制程序的执行状态。 4. **加载/存储指令**:在ARM中,内存访问通过LDR(Load Register)和STR(Store Register)指令进行。它们负责将数据从内存加载到寄存器...