tnblog
首页
视频
资源
登录

ARM LoadStore架构

1494人阅读 2024/6/25 16:47 总访问:3467447 评论:0 收藏:0 手机
分类: 嵌入式

ARM LoadStore架构

LoadStore架构


存储器之间不能直接拷贝,必须通过寄存器做中转:在 ARM 架构中,数据传输只能通过寄存器和存储器之间的操作完成,不能直接在存储器之间进行拷贝。

Load 指令

load指令 描述
ldr r0, [r7] 从地址 r7 指向的存储器中读取 4 字节的数据到寄存器 r0。
ldrb r0, [r7] 从地址 r7 指向的存储器中读取 1 字节的数据到寄存器 r0。
ldrh r0, [r7] 从地址 r7 指向的存储器中读取 2 字节的数据到寄存器 r0。
ldr r0, [r7, #8] 从 r7 地址加 8 的存储器空间中读取 4 字节的数据到寄存器 r0。
ldr pc, _irq _irq 地址(标签)中的内容载入 pc(程序计数器)。

Store 指令

Store 指令 描述
str r0, [r8] 将寄存器 r0 的值存储到 r8 地址指向的存储器空间中。
str r0, [r8, #4] 将寄存器 r0 的值存储到 r8 地址加 4 的存储器空间中,并且 r8 自增 4。
str r0, [r8, #4] (错误,应该是 str r0, [r8], #4):将寄存器 r0 的值存储到 r8 地址加 4 的存储器空间中。


下面是要用到的一些伪指令

伪指令 描述
.data 定义数据段。
.byte 在数据段中分配并初始化一个或多个字节的数据。
.space 在数据段中分配一定数量的字节,但不进行初始化。
这通常用于保留内存空间,稍后可以在程序中使用。

简单示例

  1. .text
  2. b main
  3. nop
  4. nop
  5. nop
  6. nop
  7. nop
  8. nop
  9. nop
  10. main:
  11. ldr r7,=srcBuf
  12. ldr r8,=destBuf
  13. ldr r0,[r7]
  14. str r0,[r8]
  15. main_end:
  16. b main_end
  17. .data
  18. srcBuf:
  19. .byte 0x00,0x01,0x02,0x03
  20. destBuf:
  21. .space 16
  22. .end


r7获取到的地址,我们可以通过内存memory1窗口来看数据的具体位置。
在右下角。


r8获取到的地址0x00000218占16位的空数据。
再执行如下两行将r7的内容赋值到内存中0x00000218里面了。

前索引和后索引


前索引模式在内存访问之前对基地址寄存器进行偏移计算。指令格式如下:

  1. [base, #offset]


先将 base 和 offset 相加,然后访问计算后的地址。

  1. .text
  2. b main
  3. nop
  4. nop
  5. nop
  6. nop
  7. nop
  8. nop
  9. nop
  10. main:
  11. ldr r7,=buf
  12. mov r0,#0xAB
  13. str r0,[r7,#8]
  14. main_end:
  15. b main_end
  16. .data
  17. buf:
  18. .byte 0x00,0x01,0x02,0x03
  19. .byte 0x04,0x05,0x06,0x07
  20. .byte 0x08,0x09,0x0A,0x0B
  21. .end


后索引模式在内存访问之后对基地址寄存器进行偏移计算。

  1. str r0, [r7], #8 // 将 r0 的值存储到 r7 地址处,然后 r7 = r7 + 8
  1. .text
  2. b main
  3. nop
  4. nop
  5. nop
  6. nop
  7. nop
  8. nop
  9. nop
  10. main:
  11. ldr r7,=buf
  12. mov r0,#0xAB
  13. str r0,[r7,#8]
  14. str r0,[r7],#8
  15. main_end:
  16. b main_end
  17. .data
  18. buf:
  19. .byte 0x00,0x01,0x02,0x03
  20. .byte 0x04,0x05,0x06,0x07
  21. .byte 0x08,0x09,0x0A,0x0B
  22. .end


可以看到寄存器R7的地址更新了。

load_store 实现数据拷贝


通过下面的c语言代码实现相关汇编。

  1. main(){
  2. int i = 0;
  3. const char buf[]=[1,2,3];
  4. char destBuf[8];
  5. for(i=0;i<3;i++){
  6. destBuf[i]=buf[i]
  7. }
  8. }
  1. .text
  2. b main
  3. nop
  4. nop
  5. nop
  6. nop
  7. nop
  8. nop
  9. nop
  10. main:
  11. mov r0,#0
  12. ldr r7,=buf
  13. ldr r8,=destBuf
  14. b loop_func1
  15. main_end:
  16. b main_end
  17. loop_func1:
  18. cmp r0,#3
  19. beq main_end
  20. ldrb r4,[r7],#1
  21. strb r4,[r8],#1
  22. add r0,#1
  23. b loop_func1
  24. loop_func1_end:
  25. mov pc,lr
  26. .data
  27. buf:
  28. .byte 1,2,3
  29. destBuf:
  30. .space 8
  31. .end


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Windows平台分布式架构实践 - 负载均衡

原文地址: https://www.cnblogs.com/atree/p/windows_loadbalancer.html 概述  最近.NET的世界开始闹腾了,微软官方终...

分布式服务架构与微服务架构概念的区别与联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

微服务、分布式架构项目的一点点想法

分布式与微服务的区别:说一点个人理解分布式: 分散压力。 不同功能块之间的通讯少,还是会有不少代码,每一...

Spring Cloud+.Net Core搭建微服务架构 一:服务注册

在微服务中,不同的业务被拆分成不同的服务,不同的服务之间会相互依赖,而管理这些服务就变得尤为重要搭建服务注册中心服...

服务注册与发现-架构演进

随着业务的发展,用户量日益上升,单一的系统越来越复杂,越来越庞大,单纯的提升服务器性能始终有顶天的一天,我们可以通...

.net core Ocelot 简单网关集群熔断架构整合目录

目录( 一 ) .netCore3.0 Ocelot 制作简单负载均衡 ( 二 ) .netCore3.1 consul服务集群 ( 三 ) .netCore3.1 Ocelot 与 Con...

关于三层架构以及分层的理解

首先,对软件分层,是有必要的,不管是从可维护性角度,还是从解耦的角度。其次,被滥用,这个是的,很多人,并非真正理解...

也谈TDD,以及三层架构、设计模式、ORM……

想在园子里写点东西已经很久了,但一直没有落笔,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因...

CQRS架构简介

CQRS架构简介前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海...

三层架构分层

三层架构:是一种分层的思想作用:每一层是独立完成自己的事情,降低耦合度,提高重用率,提高维护性usl: user show layer...

图灵学院四期j五期ava架构师笔记

React和Vue对比相同点:数据驱动视图,提供响应式的视图组件都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的...

consul 架构分析

本篇文章翻译自:https://www.consul.io/docs/architectureConsul 架构Consul是一个复杂的系统,它有许多不同的活动部件。...

图灵学院四五45期java架构

系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人...

领域驱动设计DDD ABP VNext 一:项目架构搭建,模块使用

[TOC]用户接口层改造nuget中下载abp依赖VoLo.Abp.AspNetCore.Mvc ItemGroup添加方式 &lt;ItemGroup&gt; &lt;Packa...

k8s基本架构流程

1:通过etcd做全局配置和服务发现; 2:flannel负责给所有docker容器分配虚拟ip给pod,以避免管理port; 3:资源被划分为...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术