首页 > 其他分享 >嵌入式:ARM多寄存器存取指令详解

嵌入式:ARM多寄存器存取指令详解

时间:2022-12-22 11:02:10浏览次数:44  
标签:mem32 R0 R1 嵌入式 指令 寄存器 列表 ARM

多寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。如:可将寄存器列表保存到堆栈,也可将寄存器列表从堆栈中恢复。 这种指令有两个特殊用法: (1)允许操作系统加载或存储用户模式寄存器来保护或恢复用户处理状态。 (2)作为异常处理返回的一部分,完成从SPSR中恢复CPSR。 ​这种指令与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。

多寄存器存取指令的二进制编码

嵌入式:ARM多寄存器存取指令详解_基址寄存器

二进制编码的低16位对应R15~R0的寄存器列表。

存储器地址可以通过基址寄存器Rn和寻址模式的定义来实现,在传送一个字前或后基址将增加或减少。如果W=1,则支持自动变址,则当指令完成时,基址寄存器将增加或减少所传送的字节数。

S位是该指令的特殊用法。如果PC在读取多寄存器的寄存器列表中,且S位置位,则当前模式的SPSR将被拷贝到CPSR。但这种指令不能用在用户模式下,因为用户模式下没有SPSR。如果PC不在寄存器列表中且S位置位,在非用户模式下,执行读取和存入多寄存器指令将传送用户模式下寄存器(虽然使用的是当前模式的基址寄存器),这使得操作系统可以保存和恢复用户处理状态。

指令汇编格式

LDM/STM{<cond>}<add mode>  Rn{!},  <registers>

这里​​<add mode>​​指定一种寻址模式,表明地址的变化是操作前还是执行后,是在基址基础上增加还是减少。 “!”表示是自动变址(W=1)。

​<registers>​​是寄存器列表,用大括号将寄存器组括起来。列表中的寄存器的次序是不重要的,它不影响存取的次序和指令执行后寄存器的值,因为这里有个约定:编号低的寄存器在存储数据或者加载数据时,对应于存储器的低地址。也就是说,编号最低的寄存器保存到最低地址,或从最低地址取数。其他依次递增。

举例

LDMIA  R1,{R0,R2,R5};R0←mem32[R1]
;R2←mem32[R1+4]
;R5←mem32[R1+8]
STMDB R1!,{R3-R6,R11,R12} ;R12→mem32[R1-4]
;R11→mem32[R1-8]
;R6→mem32[R1-12]
;R5→mem32[R1-16]
;R4→mem32[R1-20]
;R3→mem32[R1-24]
;R1 ← R1-24
STMED SP!,{R0-R7,LR} ;现场保存,将R0~R7、LR入栈
;R14→mem32[R13]
;R7→mem32[R13-4]
;……
;R0→mem32[R13-32]
;R13 ← R13-36

注意事项

  • 如果在保存多寄存器指令的寄存器列表中指定了PC ,则保存的值与体系结构实现方式有关,因此,一般应避免在STM指令中指定PC。
  • 如果在读取或存入多寄存器指令的传送列表中包含基址寄存器,则在该指令中不能使用回写模式,因为这样做的结果是不可预测的。
  • 如果基址寄存器包含的地址不是字对齐的,则忽略最低2位。一些ARM系统则可能产生异常。

参考文献:

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

标签:mem32,R0,R1,嵌入式,指令,寄存器,列表,ARM
From: https://blog.51cto.com/u_15736437/5962420

相关文章

  • 嵌入式基础
    在作业本上完成附图作业,要认真看题目要求。提交作业截图作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零) 相关知识点提取位插入位用......
  • 嵌入式基础
    提取小时:#defineTime_Addr0xFFFFC0000//实时钟芯片的IO映像基址是OxFFFFC0000#defineTIME*(volatileint*)(Time_Addr+2)intgetHours(){inttime=TIME;......
  • 嵌入式基础
    #defineTIME_Addr0xFFFFC0000#defineTIME*(volatileint*)(TIME_Addr+2)//这里需要将地址+2intgetHours(){inttime=TIME;return(time>>11)&0x......
  • 雷达图(RadarMap)
    usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;usingUnityEngine;usingUnityEngine.UI;publicclassRadarMap:MaskableGraphic{......
  • openharmony 游戏开发探索之军棋翻翻棋实现
    openharmony游戏开发探索之军棋翻翻棋实现一,引言大家也经常看到市面上有斗地主,麻将,飞行棋等不是很复杂的棋类游戏;然后作为没有开发过游戏的我,在思考一款游戏是如何开发的......
  • qemu+arm-linux-gdb模拟运行ARM程序
    在进行ARM汇编语言学习的阶段,如果没有开发板和类似于JLink的JTAG硬件调试器时,那么通常会选择在PC机上模拟运行ARM程序。方法大致有两类,第一类方法就是安装像MDK或IAR的集成......
  • HarmonyOS如何实现封装
    简化代码的一些措施http.js/***sendhttprequestutilfile*/importhttpfrom'@ohos.net.http';constBase_Url='http://nja5ih.natappfree.cc'expo......
  • 带你玩转OpenHarmony AI:基于Seetaface2的人脸识别
     简介随着时代的进步,全民刷脸已经成为一种新型的生活方式,这也是全球科技进步的又一阶梯,人脸识别技术已经成为一种大趋势,无论在智慧出行、智能家居、智慧办公等场景均......
  • Ubuntu18.04TLS系统下用Pycharm打开conda虚拟环境编译py文件
    首先找到conda的虚拟环境所在的位置,输入命令行​​condaenvlist​​​,效果如下:绿色为创建虚拟环境的命令,蓝色为虚拟环境的名称,紫色为虚拟环境在Ubuntu18.04TLS系统下的......
  • 超标量处理器设计——第七章_寄存器重命名
    超标量处理器设计——第七章_寄存器重命名参考《超标量处理器》姚永斌著目录超标量处理器设计——第七章_寄存器重命名7.1简述7.2寄存器重命名方式7.2.1用ROB进行......