ARM LDR/STR指令学习

2023-10-26

S3C2440A datasheet上关于这两条指令的说明如下:

 SINGLE DATA TRANSFER (LDR, STR), The single data transfer instructions are used to load or store single bytes or words of data.

 简单的理解就是数据的传送/存储指令。

 

接下来是datasheet上关于这两个指令格式的说明:

<LDR|STR>{cond}{B}{T} Rd,<Address>
where:
LDR   ---   Load from memory into a register
STR   ---   Store from a register into memory

这两条指令可以类比C程序的内存和硬盘之间读写数据,READ从硬盘装载数据到内存,WRITE从内存保存数据到硬盘;那么,LDR从内存装载数据到寄存器,STR从寄存器保存数据到内存。
{cond} ---Two-character condition mnemonic. See Table 3-2.  (这个可以不用考虑)
{B} ---  If B is present then byte transfer, otherwise word transfer.  (这个也可以不用考虑)
{T}  --- If T is present the W bit will be set in a post-indexed instruction, forcing non-privileged
mode for the transfer cycle. T is not allowed when a pre-indexed addressing mode is
specified or implied.   (这个也可以不用考虑)
Rd ---    An expression evaluating to a valid register number. (CPU一个寄存器的具体名字:R0~R15)
Rn and Rm ---   Expressions evaluating to a register number. If Rn is R15 then the assembler will
subtract 8 from the offset value to allow for ARM920T pipelining.
In this case base write-back should not be specified.
<Address>can be:  (以下是关于地址的几种表示方法)
1       An expression which generates an address:  (立即寻址)
The assembler will attempt to generate an instruction using the PC as a base and a
corrected immediate offset to address the location given by evaluating the expression.
This will be a PC relative, pre-indexed address. If the address is out of range, an error
will be generated.
2        A pre-indexed addressing specification:  (变址寻址)
[Rn] offset of zero
[Rn,<#expression>]{!} offset of <expression> bytes
[Rn,{+/-}Rm{,<shift>}]{!} offset of +/- contents of index register, shifted
by <shift>
3       A post-indexed addressing specification:  (偏移寻址)
[Rn],<#expression> offset of <expression> bytes
[Rn],{+/-}Rm{,<shift>} offset of +/- contents of index register, shifted as
by <shift>.
<shift> General shift operation (see data processing instructions) but you cannot specify the shift
amount by a register.


{!} --- Writes back the base register (set the W bit) if! is present  (是否会写基寄存器,这个一般很少用)

在ARM架构下,  数据从内存到CPU之间的移动只能通过LDR/STR指令来完成.  而MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位

以下是具体的应用例子:

     1.  LDR   r0,=label      用于加载立即数或一个地址值到指定寄存器中

   1.1  如果label是立即数:  LDR r0,=0X123           ;将0X123存入r0中

   1.2  如果name是个标识符:  LDR   r0,=label_1    ;将label_1所指向的地址值存入r0中

2.   LDR       r0,[r1]   ;将R1中的值存到r0中

3.   LDR       r1,[r2,#16]    ;将(r2+16)地址中的内容存到r1中

4.   LDR       r1,[r2],#4    ;将r2地址中的内容存到r1中,同时r2=r2+4

 

a.  STR   r1,[r2]        ; 将r1中的值存到r2所指定的地址中

b.  STR   r1,[r2,#4]   ;将r1中的值存到r2+4所指定的地址中

c.   STR   r1,[r2],#4  ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4


http://blog.csdn.net/leoliu0128/article/details/6055040


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM LDR/STR指令学习 的相关文章

  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段

随机推荐

  • 一个可以通过多个条件筛选的系统界面是如何实现的(springboot+mybatis)

    比如我们有一个订单记录管理界面 条件可以通过订单号 商品名称 创建日期范围 价格范围 来进行筛选查询 首先我们先确定数据库订单表 我这里就不做连表了 都放在一个表中 模拟一个订单表 order表 订单号 商品名称 创建日期 价格 地址 用户
  • 三相逆变器双闭环控制MATLAB Simulink模型,外环采用PR控制,内环采用比例控制

    三相逆变器双闭环控制MATLAB Simulink模型 外环采用PR控制 内环采用比例控制 包含仿真模型 参考文献及设计报告 设计报告中总结了逆变器的建模和PR控制的原理 推荐初学者参考 参数整定采用matlab的 m文件 ID 74206
  • 从企业架构,看TOGAF为什么越来越重要?

    一 TOGAF简介 1 什么是TOGAF 有效的企业架构 Enterprise Architecture EA 对企业的生存和成功具有决定性的作用 是企业通过IT获得竞争优势的不可缺少的手段 本文概述了企业架构及其基本概念 并非IT架构的另
  • Android屏幕适配总结

    前言 说到Android屏幕适配 是老生常谈的话题 适配的目的无非就是不同设备UI表现结果要和设计图比例一致 实际适配过程中 面对不同的机型 多样的分辨率 你适配对了吗 是否因为图片位置不对导致应用OOM 本文介绍常用屏幕适配方案宽高限定符
  • 463. Island Perimeter

    You are given a map in form of a two dimensional integer grid where 1 represents land and 0 represents water Grid cells
  • 询问关于Jmeter+Webdriver的错误如何解决

    Jmeter根据网络上找到的文章实践 运行时出现如下图问题 尝试过添加Chrome Driver config 并配置好Driver的路径 启动后出现如下错误 请问各路大佬这要怎么解决 ps jmeter插件包 JMeterPlugins
  • redis5.0十二项新特性以及集群简洁配置

    redis5 0十二项新特性以及集群简洁配置 新特性以及集群 新增的数据类型 stream 什么是stream数据类型 为什么要学习stream 安装方法 集群配置 Redis5 0集群配置修改 搭建集群命令 新特性以及集群 新增的数据类型
  • sony芯片 camera pcb layout注意事项

    PCB Layout Check List CCM尽可能使用PSRR gt 65DdB 的LDO 如果使用DC DC 应远离cmos芯片 DC DC下面尽量不要布线 用于电源芯片的电容 电感 离电源管脚越近越好 用于CMOS IC的电容 电
  • 开放原子开源基金会为白金、黄金、白银捐赠人授牌,CSDN荣获黄金捐赠人

    7月28日 以 软件定义世界 开源共筑未来 为主题的2022开放原子全球开源峰会开幕式在北京举行 开幕式上 为开放原子开源基金会白金 黄金 白银捐赠人授牌 以上排名不分先后 致敬各位捐赠人的无私奉献 对所有捐赠企业积极履行企业社会责任 贡献
  • Birdwatching 【Gym - 102501K】

    题目链接 抗疫期间 在家读如此长的题目容易烦躁hh 于是我就帮大伙读了 有N个点 M条边的无向图 我们给出图P是图G的一个衍生图 图G中的点和边图P中都有 但是图P中可能存在一些多余边 怎么说呢 就是图G中有a gt b gt c这样的边
  • 大话算法之动态规划——初探

    对于动态规划 之前学习过了 但是总感觉理解不深刻 今天正好讲道动态规划算法 感觉有了一些新的认识和看法 打算详细的写下来 一是帮助自己理清 二是希望给刚刚接触的ACMer一个简明的理解思路吧 大话算法之动态规划 初探 一 引例 数塔问题 之
  • Spring是如何创建bean创建对象的

    一 Spring是如何创建bean创建对象的 比如有以下两个service实例 Component orderService public class OrderService Component userService public cl
  • 开发代码规范

    一 编程规约 一 命名风格 1 强制 代码中的命名均不能以下划线或美元符号开始 也不能以下划线或美元符号结束 反例 name name name name name name 2 强制 所有编程相关的命名严禁使用拼音与英文混合的方式 更不允
  • Diffusion Models Beat GANs on Image Synthesis 论文笔记

    前言 生成模型主要分为两类方法 一种是基于GAN模型的生成方法 另外一种是基于对数似然模型 例如VAE DDPM等 GAN方法在FID Inception Score IS Precision等指标上取得不错的效果 但是在生成图片的多样性上
  • sar命令详解

    在使用UNIX操作系统的过程中 我们常常会用到各种各样的问题 比如系统运行速度 突然变慢 系统容易死机或者主机所带的终端常出现死机 这时我们常常猜测 是硬盘空间太小 还是内存不足 I O出现瓶颈 或者是系统的核心参数出了问 题 这时 我们应
  • 泛型<编程>:可识别联合(Discriminated Unions)(1)

    泛型 lt 编程 gt 可识别联合 Discriminated Unions 1 Andrei Alexandrescu 相信我 不管粗看上去怎么样 如果你想要的是关于编程的文章 你算来对地方了 这里讨论的不是怎样去识别一个联合 这个泛型编
  • 一文讲透机器学习超参数调优!

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 本文的主题 机器学习建模的超参数调优 开局一张图 文章很长 建议直接收藏 一 什么是机器学习超参数 机器学习超参数是在开始学习过程之前设置值的参数 而不是通过训练得到
  • C++学习笔记------指针的注意事项

    指针使用时 注意事项 定义指针先初始化 如果不能确定指针指向 指向0 nullptr 地址 如果指针没有指向 不能使用 运算符 指针也不能偏移 使用指针时 先判断 判断指针是否为空 再使用 指针操作字符串时 不能修改字符串的值 字符串在常量
  • 【Java8】Guava——Splitter

    Splitter Guava 提供了 Joiner 类用于将多个对象拼接成字符串 如果我们需要一个反向的操作 就要用到 Splitter 类 Splitter 能够将一个字符串按照指定的分隔符拆分成可迭代遍历的字符串集 简单实例 Split
  • ARM LDR/STR指令学习

    S3C2440A datasheet上关于这两条指令的说明如下 SINGLE DATA TRANSFER LDR STR The single data transfer instructions are used to load or s