嵌入式:Load/Store之单寄存器的存取指令

news2025/1/23 6:19:46

文章目录

      • Load/Store指令分类
        • 单寄存器的存取指令
          • 1、单字和无符号字节的数据传送指令
          • 指令说明
          • 指令汇编格式
          • 2、半字和有符号字节的数据传送指令
          • 指令汇编格式

ARM处理器是Load/Store型的,即它对数据的操作是通过将数据从存储器加载到片内寄存器中进行处理,处理完成后的结果经过寄存器存回到存储器中,以加快对片外存储器进行数据处理的速度。

ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。

在ARM系统中I/O操作是通过存储器映射进行寻址的,对I/O设备的操作可以和对存储器的操作一样,因此,也是使用Load/Store指令完成。

Load/Store指令分类

ARM指令集中有三种基本的数据存取指令:

  • 单寄存器的存取指令(LDR,STR):提供寄存器和存储器之间最灵活的单数据项传送方式,传送的数据可以是8位字节、16位半字或32位字。
  • 多寄存器存取指令(LDM,STM):可有效地用于大批数据的传送。一般这些指令用于进程的进入和退出,保存和恢复工作寄存器以及拷贝存储器中一块数据。
  • 单寄存器交换指令(SWP):用于寄存器和存储器中的数据交换。在一个指令中完成存取操作。该指令常用来完成信号量操作,而信号量是一种解决进程同步和互斥问题的机制。

单寄存器的存取指令

单寄存器存取指令是ARM在寄存器和存储器间传送单个字节和字的最灵活方式。根据传送数据的类型不同,单个寄存器存取指令又可以分为以下两类:

  • 单字和无符号字节的数据传送指令
  • 半字和有符号字节的数据传送指令
1、单字和无符号字节的数据传送指令

这一类数据传送指令的编码格式如下:

指令说明

基址寄存器加上或减去一个无符号立即数或者 寄存器偏移量构成存储器访问地址。
当从存储器读取一个无符号字节数据时,需要将它用0扩展到32位,然后放置到目的寄存器中。
当从一个寄存器向存储器写一个字节的数据时,写的是寄存器的低8位。
前变址的寻址模式使用计算出的地址作为存储器地址进行数据存取操作,然后,当要求回写(W=1)(即自动变址方式),将基址寄存器更新为计算出的地址值。
后变址的寻址模式用未修改的基址寄存器来传送数据,然后将基址寄存器更新为计算出的地址,而不管W位如何。

指令汇编格式

前变址格式

   LDR|STR {<cond>} {B} Rd, [Rn, <offset>] {!}

​ 其中B表示是按字节传送,缺省时按字传送,offset可能是±12位立即数,或者±Rm{},这里shift包括移位方式和移位位数,移位位数只能是5位立即数,而不能再来自于寄存器Rs。根据有无{!}选择是否回写(自动变址)。
后变址格式

   LDR|STR {<cond>} {B} {T} Rd, [Rn],<offset>

​ 其中T标志只能在非用户模式(即特权模式)下使用,作用是选择用户角度的存储器访问。
相对PC的形式

   LDR|STR {<cond>} {B} Rd, LABEL 

举例:

LDR  R8,[R10]   ;R8←[R10]
LDRNE R1,[R5,#960]!  ;(有条件地)R1←[R5+960],R5 ←R5+960
STR  R2,[R9,#consta-struc] ;consta-struc是常量表达式,范围为-4095~4095
STRB R0,[R3,-R8,ASR #2] ;R0→[R3-R8÷4],存储R0的最低有效字节,但R3和R8的内容不变
LDR  R1,localdata   ;加载一个字,该字位于标号localdata所在地址。(相对PC形式)
LDR  R0,[R1],R2,LSL #2 ;将地址为R1的内存单元数据读取到R0中,然后R1←R1+R2*4
LDRB R0,[R2,#3] ;将内存单元(R2+3)中的字节数据读到R0中,R0的高24位被设置为0
LDR  R1,[R0,-R2,LSL #2] ;将R0-R2*4地址处的数据读出,保存到R1中,R0,R2的值保持不变。
STR  R0,[R7],#-8   ;将R0的内容存到R7中地址对应的内存中,R7←R7-8

在编程中,常使用相对PC的形式将R0中的一个字存到外设UART,如:

       LDR    R1,UARTADD
       STR     R0,[R1]

​ 或者,使用相对PC形式将外设UART数据读到R0 ,如:

       LDR    R1,UARTADD
       LDR    R0,[R1]

注意:

这里UARTADD标号在附近4KB范围之内。

使用PC作为基址时,得到的传送地址为当前指令地址加8字节;PC不能用作偏移寄存器,也不能用于任何自动变址寻址模式(包括后变址模式)。

把一个字读到PC可以使程序转移到读取的地址,从而实现程序跳转。但应避免将一个字节读取到PC。应尽量避免把PC存储到存储器,因为不同处理器可能会产生不同的结果。

只要不使用自动变址,Rd=Rn是可以的,但在一般情况下,Rd、Rn和Rm应是不同的。

2、半字和有符号字节的数据传送指令

有符号的字节或半字的传送用“符号位”扩展到32位。无符号半字的传送用0扩展到32位。这类数据传送的二进制编码如下:

立即数偏移量只能8位之内。
寄存器偏移量不可移位得到。
S、H用于定义所传送的数据类型。

SH数据类型
10有符号字节
01无符号半字
11有符号半字
指令汇编格式

这一类数据传送指令的汇编格式如下:

前变址格式

     LDR|STR{ <cond>} H|SH|SB  Rd,  [Rn, <offest>]{!}

后变址格式

     LDR|STR {<cond>} H|SH|SB  Rd,  [Rn], <offest> 

式中是#±<8位立即数>或#±Rm;H|SH|SB选择传送数据类型;其它部分的汇编器格式与传送字和无符号字节相同。所有半字传送应使用半字对齐的地址。

举例:

LDREQSH  R11,[R6];(有条件地) R11←[R6],加载16位半字,有符号扩展到32位
LDRH R1,[R0,#20]! ;R1←[R0+20],加载16位半字,0扩展到32位
STRH  R4,[R3,R2] ;R4→[R3+R2],存储最低的有效半字到R3+R2
LDRSB R0,const ;加载位于标号const地址的字节,有符号扩展
LDRH  R6,[R2],#2 ;将R2地址上的半字数据读出到R6,高16位用0扩展,R2=R2+2
LDRSH  R1,[R9];将R9地址上的半字数据读取到R1中,高16位用符号位扩展
STRNEH  R0,[R2,#960] ;(有条件地)将R0的内容送到(R2+960)的内存中,R2=R2+960

参考文献:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SuperMap iPortal 对接postgis业务数据库(二):大屏使用接口数据更新图表和地图

本文是SuperMap iPortal 对接postgis业务数据库的第二个步骤&#xff1a;大屏使用接口数据更新图表和地图。 这个步骤可以有两种方式去实现数据的展示和更新如下&#xff1a; 一、使用数据上图构建地图并在大屏中使用 1. 数据上图构建地图 打开iPortal 应用中心的数据上图&a…

教你如何轻松搞定云上打印管理

摘要&#xff1a;加快自主创新&#xff0c;满足数字化用户多场景文印需求。本文分享自华为云社区《有了司印云打印&#xff0c;云上打印管理轻松搞定&#xff01;》&#xff0c;作者&#xff1a;云商店 。 作为与职场和个人办公息息相关的工作场景&#xff0c;打印长期以来都是…

uniapp-uView在离线状态下无法显示icon图标的问题

1、修改uview-ui下的u-icon.vue配置文件&#xff0c;一般目录在 uni_modules\uview-ui\components\u-icon\u-icon.vue 2、源文件引入的是阿里巴巴的icon https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf font-face {font-family: uicon-iconfont;src: url(https://at.…

restful风格快速入门

restful风格入门 概述 简介&#xff1a;REST(Representational State Transfer),表现形式状态转换。 传统风格 http://localhost/users/getById?id1 http://localhost/users/saveUser REST风格 http://localhost/users/1 http://localhost/users 对比&#xff1a; 对比可…

spring-boot sentry 不触发事件

按照官网的提示https://docs.sentry.io/platforms/java/guides/spring-boot/performance/ 一步一步的确认&#xff0c;但是最终就是不触发事件 解决过程&#xff1a; 1.开启debug 在properties文件增加一行 sentry.debugtrue2.运行&#xff0c;查看日志输出。 dsn什么的配…

Android代码保护与反调试方案

1、代码保护方案 1.1、Proguard代码混淆 ProGuard是一个开源的Java代码收缩器&#xff0c;优化器&#xff0c;混淆器和预校验器&#xff0c;ProGuard的作用如下&#xff1a; &#xff08;1&#xff09;压缩(Shrink):检查并移除代码中无用的类、字段、方法&#xff1b; &#…

一键回复聊天软件

不论是何种行业&#xff0c;高效工作都是企业一直在追求的&#xff0c;如果在为客户提供服务的过程中&#xff0c;有一个趁手的好工具是可以带来事半功倍的效果的。 前言 随着互联网的发展&#xff0c;越来越多的工作开始转向线上化&#xff0c;通过网络可以满足客户的多种需求…

手写Srping10(实现容器事件监听)

文章目录目标设计项目结构一、实现1、定义事件接口--ApplicationEvent1、定义通用应用上下文事件--ApplicationContextEvent2、定义刷新和关闭事件--ContextClosedEvent、ContextRefreshedEvent2、定义事件监听--ApplicationListener3、定义事件广播器--ApplicationEventMultic…

audio_open函数分析

audio_open() 的作用&#xff0c;就如同它的名字那样&#xff0c;就是打开音频设备。流程图如下&#xff1a; SDL 库播放音频数据有两种方式。 1&#xff0c;调用层定时往 SDL 接口塞数据。 2&#xff0c;设置SDL回调函数&#xff0c;让 SDL 来主动执行回调函数来取数据。 第…

ABAP 字符处理

场景1:是否只包含数字 str1 CO 0123456789 涉及关键字&#xff1a;CO&#xff0c;使用公式 str1 CO str2 。表示 str1 中 的每个字符 在 str2 中都能找到 类比&#xff1a;无 场景2&#xff1a;字符串1 是否 包含 字符串2 DATA str1 TYPE STRING VALUE hello world. DATA …

Pytest测试框架搭建需求及实现方案

目录 框架需求及实现方案 框架需求 实现方案 支持接口自动化、Web UI自动化及App自动化 可以批量运行用例并生成测试报告 测试完成发送邮件 提供灵活的运行方式&#xff0c;如按功能模块运行、按脚本运行、按用例等级运行等等 提供运行日志方便定位问题 支持切换环境 …

李沐精读论文:MAE 《Masked Autoencoders Are Scalable Vision Learners》

论文&#xff1a;Masked Autoencoders Are Scalable Vision Learners 别再无聊地吹捧了&#xff0c;一起来动手实现 MAE(Masked Autoencoders Are Scalable Vision Learners) 玩玩吧&#xff01; - 知乎 参考博文&#xff1a;MAE 论文逐段精读【论文精读】 - 哔哩哔哩 神洛华…

QT 学习笔记(十)

文章目录一、绘图1. 理论知识储备2. 画背景图3. 简单绘图4. 手动刷新窗口二、绘图实现代码1. 主窗口头文件 widget.h2. 主窗口头文件 widget.cpp由于每次代码都是在原有程序上修改&#xff0c;因此除了新建项目&#xff0c;不然一般会在学完后统一展示代码。 提示&#xff1a;具…

【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)

卷积神经网络 卷积神经网络&#xff08;convolutional neural network, CNN&#xff09;在提出之初被成功应用于手写字符图像识别&#xff0c;2012年的AlexNet网络在图像分类任务中取得成功&#xff0c;此后&#xff0c;卷积神经网络发展迅速&#xff0c;现在已经被广泛应用于…

怎样在Odoo 16中启用完整的财务功能

Odoo是目前市场上最好的ERP软件之一。Odoo提供两种类型的版本&#xff0c;社区版和企业版。Odoo社区版是由开源软件支持的免费基本版。Odoo社区版本中没有一些模块和功能。但企业版付费版&#xff0c;升级版更适合更高的价值。Odoo企业版具有无限的功能支持和完整的功能。性能和…

「集合底层」深入浅出HashMap底层源码

「集合底层」深入浅出HashMap底层源码 一、HashMap介绍 HashMap底层采用了哈希表&#xff0c;而哈希表是由数组和链表实现的。数组和链表各有自己的特点&#xff1a; 数组&#xff1a;占用空间连续。 寻址容易&#xff0c;查询速度快。但是&#xff0c;增加和删除效率非常低…

倒序打印链表

在做这个题的时候我闹了一个大笑话&#xff0c;我用了反转链表做&#xff0c;哈哈哈哈&#xff0c; 这个题目思路很简单&#xff0c;用到了数组的头插法&#xff0c;注意题目要求返回数组 遍历链表&#xff0c;将链表的val放到数组中 下面来看代码 import java.util.ArrayLis…

flash基础知识

flash基础手册一、flash概念&#xff08;一&#xff09;特性&#xff08;二&#xff09;FLASH的块/扇区/页关系&#xff08;三&#xff09;常用FLASH型号大小&#xff08;四&#xff09;常用FLASH擦写规则&#xff08;五&#xff09;存储器类型参考二、与其他类型存储器件对照&…

PDF文件怎么加密?推荐3种方法给你

在我们的工作学习上&#xff0c;应该有不少人都需要使用到PDF文件格式&#xff0c;毕竟这个格式它兼容性较广&#xff0c;且不易编辑&#xff0c;能较好的保存文件。不过&#xff0c;我们有时为了不让它被其它人随意查看&#xff0c;会给这个文件进行加密的操作。那你们知道如何…

python实现基于TNDADATASET的人体行为识别

首先来看下TNDADATASET&#xff1a; 随便打开一个文件简单看下如下所示&#xff1a; 可以大概推测出来&#xff0c;这里面不同维度的数据集应该是由不同的穿戴式传感器采集得到的&#xff0c;最后一列的class表示的是当前的行为类型。 在我之前的博文里面已经做过了相关的工作…