嵌入式:交换指令之SWP,MRS,MSR

article/2025/9/13 14:15:32

文章目录

    • 存储器与寄存器交换指令(SWP)
      • 二进制编码格式
      • 汇编格式
      • 举例
    • 状态寄存器与通用寄存器之间的传送指令
    • MRS
      • MRS的二进制编码
      • 汇编格式
    • MSR
      • MSR的二进制编码
      • 汇编格式

存储器与寄存器交换指令(SWP)

交换指令把字或无符号字节的读取和存储组合在了一条指令中。这种组合指令通常用于不能被外部其他存储器访问(如:DMA访问)打断的存储器操作。一般用于处理器之间或处理器与DMA控制器之间共享信息的互斥访问。

二进制编码格式

汇编格式

SWP{<cond>} {B} Rd,Rm,[Rn] 

本指令将存储器中地址为Rn处的字(B=0)或无符号字节(B=1)读入寄存器Rd,同时,将Rm中同样类型的数据存入存储器中相同的位置。Rd和Rm可以相同,但与Rn应该不同。另外,PC不能出现在该指令中。

举例

LDR  R0,SEMAPHORE
SWPB R1,R1,[R0] ;交换字节,将存储器单元[R0]中的字节数据读取到R1中,同时,将R1中的数据写入到存储器单元[R0]中 
SWP  R1,R2,[R3]; 交换字数据,将存储单元[R3]中的字数据读取到R1中,同时,将R2中的数据写入到存储单元[R3]中。            

状态寄存器与通用寄存器之间的传送指令

ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。 这两条指令分别是:

  • 状态寄存器到通用寄存器的传送指令(MRS)
  • 通用寄存器到状态寄存器的传送指令(MSR)

MRS

MRS指令用于将状态寄存器的内容传送到通用寄存器中,它主要用于以下3种场合:

  1. 通过“读-修改-写”修改状态寄存器的内容。MRS用于将状态寄存器的内容读到通用寄存器中,以便修改。
  2. 当异常中断允许嵌套时,需要在进入异常中断后,嵌套中断发生之前,保存当前处理器模式的SPSR。这是需要先通过MRS指令读出SPSR的值,然后用其他指令将SPSR的值保存起来。
  3. 当进程切换时,也需要保存当前寄存器的值。

MRS的二进制编码

这里R用来区分是将CPSR还是SPSR拷贝到目的寄存器Rd,全部32位都被拷贝。

汇编格式

MRS{<cond>} Rd,CPSR|SPSR 

举例:

    MRS   R0,CPSR  ;将CPSR传送到R0 MRS  R3,SPSR   ;将SPSR传送到R3 

注意事项:

不能通过该指令修改CPSR中的T控制位,直接将程序状态切换到Thumb状态,必须通过BX等指令实现程序状态切换。

在用户或系统模式下没有可以访问的SPSR,所以SPSR形式在这些模式下不能用。

当修改CPSR或SPSR时,必须注意保存所有未使用位的值。
这条指令不影响条件标志码。

MSR

MSR的二进制编码

操作数可以是一个寄存器Rm也可以是带循环移位的8位有效立即数,在域屏蔽的控制下传送到CPSR或SPSR。

域屏蔽控制PSR中4字节的更新,其中第16位控制PSR[7:0]是否更新,第17位控制PSR[15:8],第18位控制PSR[23:16],第19位控制PSR[31:24]。使用立即数时,只有PSR[31:24]可选择。

汇编格式

MSR{<cond>} CPSR_f | SPSR_f,#<32-bit immediate>
MSR{<cond>} CPSR_<field> | SPSR_<field>,Rm 

这里的表示下列情况之一:

  • c—控制域,对应PSR[7:0]
  • x—扩展域,对应PSR[15:8](在当前ARM中未使用)
  • s—状态域,对应PSR[23:16](在当前ARM中未使用)
  • f—标志位域,对应PSR[31:24]

举例:

  1. 设置N、Z、C和V标志位
         MSR    CPSR_f,#0xF0000000  ;设置所有标志位 
  1. 仅设置C标志位,保存N、Z和V
         MRS    R0,CPSR      ;将CPSR传送到R0ORR    R0,R0,#0x200000000 ;设置R0的第29位MSR    CPSR_f,R0    ;传送回CPSR
  1. 从监控模式切换到IRQ模式
         MRS   R0,CPSR       ;将CPSR传送到R0BIC   R0,R0,#0x1F   ;低5位清0ORR  R0,R0,#0x12  ;设置为IRQ模式MSR  CPSR_c,R0    ;传送回CPSR

注意事项:

在用户模式下不能对CPSR[23:0]做任何修改。

在用户或系统模式下没有SPSR,所以应尽量避免在这些模式下访问SPSR。

在嵌套的异常中断处理中,当退出中断处理程序时,通常通过MSR指令将事先保存了的SPSR内容恢复到当前程序状态寄存器CPSR中。

在修改的状态寄存器位域中包括未分配的位时,避免使用立即数方式的MSR指令。

不能通过该指令直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令来完成程序状态的切换。

参考文献:

孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.


http://chatgpt.dhexx.cn/article/5sU0dPsv.shtml

相关文章

PolarDN(swp)

PolarD&N配上题目链接 提示是swp文件&#xff0c;首先了解swp文件是什么&#xff1f; 了解了之后直接访问swp文件 用vs打开审计代码 <?php function jiuzhe($xdmtql){ return preg_match(/sys.*nb/is,$xdmtql); } $xdmtql$_POST[xdmtql]; if(!is_array($xdmtql)){ if(!…

swp协议-1

Swp接口是UICC和CLF&#xff08;非接前端&#xff09;之间的面向比特流&#xff0c;点到点通信的协议。CLF是主设备&#xff08;master&#xff09;&#xff0c;UICC是从设备&#xff08;slave&#xff09;。图SWP数据传输虽然是单线协议&#xff0c;但是是全双工数字传输。 1 …

vim 查看编辑文件,出现.swp文件的情况和处理方法

对应的翻译是&#xff1a; E325: 注意 发现交换文件 ".catalina.sh.swp" 所有者: 文件名: 修改过: 是 用户名: 主机名: 进程 ID: 正在打开文件 "catalina.sh" 日期…

swp安装(Scientific Work Place)

一、swp安装 下载完群里的安装包以后解压&#xff0c;打开文件夹swp5.5&#xff0c;双击Scientific.WorkPlace.v5.exe User Name和Company Name随便填&#xff0c;Serial Number即序列号打开f.txt使用里面的序列号进行安装 自定义安装目录 这里安装一般选择complete或者typica…

Linux编辑文件时,提示.swp文件已存在怎么办?

在学习Linux的时候&#xff0c;学到了Vim编辑器突然会出现 交换文件".文件名.swp"已存在&#xff01; 出现这种情况&#xff0c;一般来说都是没有保存退出导致的 解决的办法为&#xff1a; 先按Q退出到文件所在目录 在ls -al 获取目录下所有文件&#xff08;包括…

【Linux】swp文件

linux swp文件是一种后缀为“.swp”的文件&#xff0c;该文件是在当使用vi或者vim编辑一个文件时产生的&#xff0c;当编辑完成正常退出时&#xff0c;该文件就会自动删除&#xff1b;swp文件是隐藏文件&#xff0c;在目录下使用“ls -al”才能查看。 1. 出现swp文件的现象 我…

【智能卡】智能卡之SWP

本篇博文最后修改时间&#xff1a;2016年12月20日&#xff0c;12:05。 一、简介 本文简要介绍智能卡的SWP。 二、版权声明 博主&#xff1a;甜甜的大香瓜 声明&#xff1a;喝水不忘挖井人&#xff0c;转载请注明出处。 原文地址&#xff1a;http://blog.csdn.NET/feilusia 联系…

java 递归详解_Java递归函数讲解

Java中的递归 什么是递归&#xff1f; 函数直接或间接调用自身的过程称为递归&#xff0c;相应的函数称为递归函数。使用递归算法&#xff0c;某些问题可以很容易地解决。这类问题的例子有Hanoi的Towers(TOH)、序/前序/后序树遍历、图的DFS等。 递归中的基本条件是什么&#xf…

Java 递归 跳出死循环

Java 递归 跳出死循环 学习了知道树形数据&#xff0c;如何遍历子集&#xff0c;生成List数据&#xff0c;如果数据里面是带各种循环的呢&#xff1f; 要如何处理&#xff1f; 如何跳出死循环&#xff1f; 要求&#xff1a; 根据当前环节id&#xff0c;比如18&#xff0c;找到…

java递归实现汉诺塔

汉诺塔的规则是:一共三根柱子,一根柱子从上到下套着有小到大的若干个圆盘,要将所有圆盘按照这个排放顺序移动到第三根柱子上,并且每次只能移动一个圆盘. 可以将整个过程分为三个步骤来看: 第一步:将除最大圆盘外的n-1个圆盘移动辅助柱子上 第二步:将最大的圆盘移动到目标柱子 …

Java递归生成树

1.建菜单表 CREATE TABLE t_menu (id int(11) NOT NULL AUTO_INCREMENT,pid int(11) NOT NULL,name varchar(255) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT11 DEFAULT CHARSETutf8mb4;2.造一些数据 注意&#xff1a;根节点的pid0&#xff0c;其他节点的p…

Java递归练习

目录 1. 递归求N的阶乘 2. 按顺序打印一个数字的每一位 3. 递归求n的和 4. 计算一个数每一位之和 5. 求斐波那契数列的第N项 6. 汉诺塔 7. 青蛙跳台阶 1. 递归求N的阶乘 //递归求n的阶乘 public class test {//求n的阶乘方法public static int func(int n) {if (n 1) …

java递归查询

递归建立数据库的字段要建立pid 既pid是父id 这里的pid要能在id找到 找到就说明当前id的组织是父组织 如果找不到就说明的顶级id 图中的主菜单1就是顶级组织 public Menu getMenuTree() {//先查询顶级目录LambdaQueryWrapper<Menu> menuLambdaQueryWrapper new LambdaQ…

java 积累递归深度_java递归的深度

递归的深度 在使用递归的时候经常会抛出StackOverflowError&#xff0c;顾名思义就是栈满了&#xff0c;而我们这里所说的栈在java中通常就是虚拟机栈(vm stack)&#xff0c;在每个方法执行的同时都会创建一个栈帧&#xff0c;用于存储局部变量表、操作数栈&#xff0c;动态链接…

Java递归全排列

Java递归全排列 目录 1&#xff0c; 全排列实现思路 排列组合概念 理解 2&#xff0c;全排列的重点 3&#xff0c;全排列java实现 Java: 结果&#xff1a; 总结&#xff1a; 1&#xff0c; 全排列实现思路 排列组合概念 排列&#xff0c;就是指从给定n个数的元素中取出…

Java递归优化

目录 一、经典递归二、尾递归优化 一、经典递归 &#xff08;注&#xff1a;本文例子只用于探讨&#xff0c;不考虑n<0 等复杂情况。&#xff09; int factorial(int n){if(n1){return 1;}else{return n*factorial(n-1);} }执行过程如下&#xff1a; factorial&#xff0…

java中的方法递归

JAVA中的方法递归 递归的思路代码举例 一、递归的思路 一个方法在执行时&#xff0c;调用自身被称为“递归”。 递归相当于数学归纳法&#xff0c;有一个起始条件&#xff0c;有一个递推公式。 递归可以分为&#xff1a;单路递归和多路递归&#xff08;如二叉树和斐波那契数…

Java递归简介

Java递归简介 Java中的递归定义为“方法直接或间接调用自身&#xff08;相同方法&#xff09;”。递归函数用于需要一次又一次地执行同一组操作直到达到结果的情况。它执行几次迭代&#xff0c;并且每次迭代问题说明都变得越来越简单。Java中的递归是一种基于对同一问题的较小…

Java中的递归详解

文章目录 概述递归累加求和计算1 ~ n的和代码执行图解 递归求阶乘递归打印多级目录综合案例文件搜索 文件过滤器优化Lambda优化 概述 递归&#xff1a;指在当前方法内调用自己的这种现象。递归的分类: 递归分为两种&#xff0c;直接递归和间接递归。直接递归称为方法自身调用自…

fstream的操作

第一段转载自&#xff1a;https://blog.csdn.net/jaster_wisdom/article/details/52400059 在C中输入输出到指定文件&#xff0c;或者从指定文件中读出数据使用fstream类较为方便。 1.将数据写到磁盘的指定文件中 首先第一步是加头文件#include <fstream>,引入库函数 第二…