ARM汇编指令MRS 和MSR代码
时间: 2024-06-04 15:06:39 浏览: 15
MRS指令用于将特定系统寄存器的值移动到通用寄存器中,而MSR指令用于将通用寄存器的值移动到特定系统寄存器中。
以下是MRS和MSR的示例代码:
MRS R0, CPSR ;将CPSR寄存器的值移动到R0通用寄存器中
MSR CPSR_cxsf, #0x10 ;将CPSR寄存器的cxsf位设置为0x10
相关问题
实验内容 (1) 使用 MRS/MSR 指令切换工作模式,并初始化各种模式下堆栈指针; (2) 观察 ARM 处理器在各种模式下寄存器的区别。
1. 使用 MRS/MSR 指令切换工作模式,并初始化各种模式下堆栈指针:
ARM 处理器有 7 种工作模式:User Mode、FIQ Mode、IRQ Mode、Supervisor Mode、Abort Mode、Undefined Mode 和 System Mode。在不同的工作模式下,处理器所能使用的寄存器和堆栈指针也不同。因此,切换工作模式时需要使用 MRS/MSR 指令来保存和恢复寄存器和堆栈指针。
下面是在不同工作模式下切换并初始化堆栈指针的示例代码:
```
main:
MRS R0, CPSR ;读取当前程序状态寄存器(CPSR)
BIC R0, R0, #0x1F ;将最低 5 位清零,以便设置新的工作模式
ORR R0, R0, #0x10 ;设置为 Supervisor Mode
MSR CPSR_c, R0 ;切换工作模式
MOV SP, #0x8000 ;初始化 Supervisor Mode 下的堆栈指针
SRS #0x13 ;进入中断处理程序,自动切换到 IRQ Mode
irq_handler:
MOV SP, #0x9000 ;初始化 IRQ Mode 下的堆栈指针
……
RFE ;从中断处理程序返回,自动切换到 Supervisor Mode
MOV SP, #0x8000 ;恢复 Supervisor Mode 下的堆栈指针
MRS R0, CPSR ;读取当前程序状态寄存器
BIC R0, R0, #0x1F ;将最低 5 位清零,以便设置新的工作模式
ORR R0, R0, #0x1F ;设置为 System Mode
MSR CPSR_c, R0 ;切换工作模式
MOV SP, #0x10000 ;初始化 System Mode 下的堆栈指针
……
```
2. 观察 ARM 处理器在各种模式下寄存器的区别:
在不同的工作模式下,ARM 处理器所能使用的寄存器和堆栈指针也不同。下面是各种工作模式下 ARM 处理器的寄存器和堆栈指针的区别:
- User Mode:可以使用所有的寄存器和堆栈指针。
- FIQ Mode:可以使用所有的寄存器和堆栈指针,但需要额外的 7 个 FIQ 寄存器来保存 FIQ 中断处理程序的状态和数据。
- IRQ Mode:可以使用所有的寄存器和堆栈指针,但需要额外的 2 个 IRQ 寄存器来保存 IRQ 中断处理程序的状态和数据。
- Supervisor Mode:可以使用所有的寄存器和堆栈指针,但需要额外的 2 个 Supervisor 寄存器来保存 Supervisor 模式下的状态和数据。
- Abort Mode:可以使用所有的寄存器和堆栈指针,但需要额外的 2 个 Abort 寄存器来保存 Abort 模式下的状态和数据。
- Undefined Mode:可以使用所有的寄存器和堆栈指针,但只能使用部分的 ARM 指令和没有定义的指令。
- System Mode:可以使用所有的寄存器和堆栈指针,但不能使用所有的协处理器指令。
因此,在编写 ARM 汇编程序时,需要根据不同的工作模式来选择合适的寄存器和堆栈指针,并注意不同工作模式下的指令限制和特点。
ARM汇编语言写一个完整的实现FIQ中断处理和返回的程序
下面是一个完整的实现FIQ中断处理和返回的ARM汇编程序示例:
```assembly
.text
.global main
.global fiq_handler
.equ VIC_BASE, 0x10140000
.equ VIC_INTENABLE, 0x010
.equ VIC_IRQSTATUS, 0x000
.equ VIC_FIQSTATUS, 0x004
main:
mov r0, #0x1 @ 设置FIQ中断使能位
str r0, [r1, #VIC_INTENABLE]
mov r0, #0x1 @ 使能IRQ中断
mrs r1, cpsr
bic r1, r1, #0x80
msr cpsr_c, r1
b loop
loop:
b loop
fiq_handler:
cpsid if @ 禁用IRQ中断和FIQ中断
@ FIQ中断处理程序
@ 这里可以编写处理FIQ中断的代码
@ ...
mov r0, #0x1 @ 清除FIQ中断标志位
str r0, [r1, #VIC_FIQSTATUS]
subs pc, lr, #4 @ 返回到中断处理前的任务
cpsie if @ 恢复IRQ中断和FIQ中断
bx lr @ 返回
.end
```
这个程序首先设置FIQ中断的使能位,并使能IRQ中断。在主循环中,程序无限循环。当FIQ中断发生时,处理器会跳转到定义的FIQ中断处理程序中。在FIQ中断处理程序中,首先禁用IRQ中断和FIQ中断,然后编写处理FIQ中断的代码。处理完成后,清除FIQ中断标志位,并返回到中断处理前的任务。最后,恢复IRQ中断和FIQ中断,并使用`bx lr`指令返回到中断处理前的任务。
需要注意的是,在具体的应用中,需要根据实际情况选择使用哪些寄存器和内存地址,以及如何编写处理FIQ中断的代码。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)