ARM指令集——状态寄存器访问指令

2024-08-28 12:18

本文主要是介绍ARM指令集——状态寄存器访问指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ARM中有两条指令用于状态寄存器和通用寄存器之间传送数据。程序不能直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。通常修改状态寄存器时通过“读取-修改-写回”的操作序列来实现的。状态寄存器访问指令包括以下两条指令:

  • MRS 状态寄存器到通用寄存器的传送指令
  • MSR 通用寄存器到状态寄存器的传送指令
下面一一介绍之:
1、MRS
指令的语法格式:
MRS{<cond>} <Rd>, CPSR
MRS{<cond>} <Rd>, SPSR
指令操作的伪代码:
if ConditionPassed(cond) then 
if R == 1 then
Rd = SPSR
else
Rd = CPSR

指令的使用:
MRS指令主要用于以下3种场合:
  • 通常通过“读出-修改-写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中。
  • 当异常中断允许嵌套时,需要在进入异常中断后,嵌套中断之前保存当前处理模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,再用其他指令将SPSR值保存起来。
  • 在进程切换时也需要保存当前状态寄存器的值。

2、MSR
指令的语法格式:
MSR{<cond>} CPSR_<fields>, #<immediate>
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>
其中,
<fields>设置状态寄存器中的位域。状态寄存器的32位可以分为4个8位的域。bits[31:24]为条件标志位,用f表示;bits[23:16]为状态位域,用s表示。bits[15:8]扩展位域,用x表示。bits[7:0]控制位域,用c表示。
指令操作的伪代码:
if ConditionPassed(cond) then
if operand[25] == 1
operand = 8_bit_immediate Rotate_Right (rotate_imm * 2)
else
operand = Rm
if R == 0 then
if field_mask[0] == 1 and InAPrivilegedMode() then
CPSR[7:0] = operand[7:0]
if field_mask[1] == 1 and InAPrivilegedMode() then
CPSR[15:8] = operand[15:8]
if field_mask[2] == 1 and InAPrivilegedMode() then
CPSR[23:16] = operand[23:16]
if field_mask[3] == 1 and InAPrivilegedMode() then
CPSR[31:24] = operand[31:24]
else
if field_mask[0] == 1 and CurrentModeHasSPSR() then
SPSR[7:0] = operand[7:0]
if field_mask[1] == 1 and CurrentModeHasSPSR() then
SPSR[15:8] = operand[15:8]
if field_mask[2] == 1 and CurrentModeHasSPSR() then
SPSR[23:16] = operand[23:16]
if field_mask[3] == 1 and CurrentModeHasSPSR() then
SPSR[31:24] = operand[31:24]

指令的使用:
MSR指令通常用于恢复状态寄存器的内容或者改变状态寄存器的内容。
当退出异常中断处理程序时,如果事先保存了状态寄存器的内容,通常通过MSR指令将事先保存的状态寄存器内容恢复到状态寄存器中。
当需要修改状态寄存器中的内容时,通过“读出-修改-写回”指令序列完成。写回操作也是通过MSR指令完成的。
考虑到指令执行的效率,通常在MSR指令中指定指令将要修改的位域。例如,下面的指令序列将处理器模式切换到特权模式,这里只修改状态寄存器的控制位域,所以在指令中指定该位域。
MRS R0,CPSR ;读取CPSR
BIC R0, R0, #0x1F ;修改、去除当前处理器模式
ORR R0, R0,#0x13 ;修改、设置特权模式
MSR CPSR_c,R0 ;写回,仅仅修改CPSR中的控制位域

这篇关于ARM指令集——状态寄存器访问指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114739

相关文章

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.