嵌入式ARM设计编程(一) 简单数据搬移

news2024/11/28 22:50:18

文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。

一、实验目的

熟悉实验开发环境,掌握简单ARM汇编指令的使用方法。

二、实验环境

硬件:PC机

软件:ADS1.2 集成开发环境

三、实验内容

熟悉开发环境并使用LDR/STR,MOV等指令访问寄存器或存储单元;

使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

四、实验要求

(1)按照2.3节介绍的方法, 在ADS下创建一个工程asmlab1,定义两个变量x,y和堆栈地址0x1000,将变量x的内容存到堆栈顶,然后计算x+y,并将和存到堆栈的下一个单元。通过AXD查看寄存器和memory和寄存器中数据变化。

(2)在指令后面加上适当注释,说明指令功能。

(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。

五、实验完成情况

1、实验源代码(含注释):

AREA Init,CODE,READONLY  ;伪指令AREA定义名为Init,属性为只读或的代码片段
  ENTRY  ;伪指令ENTRY声明程序入口
  CODE32 ;声明以下代码为 32 位 ARM 指令
x EQU 45
y EQU 64 ;定义两个变量 x,y
stack_top EQU 0x1000 ;定义堆栈地址 0x1000
start MOV SP, #stack_top  ;设置栈顶地址
      MOV R0, #x  ;把x的值赋给R0
      STR R0, [SP]  ;R0中的内容入栈
MOV R0, #y  ;把y的值赋给R0
LDR R1, [SP]  ; 数据出栈,放入R1,即R1中放x的值
      ADD R0, R0, R1  ;R0=R0+R1
      STR R0, [SP,#4] ;先执行SP+4(ARM为32位指令集),再将R0内容复制到SP指向的寄存器
      B .
END  ;程序结束

2、实验过程(含结果截图及相应文字解释):

根据代码可知,

1.首先执行start MOV SP, #stack_top 通过该语句设置了栈顶地址为0x1000。

2.然后执行MOV R0, #x,把x的值赋值给了R0寄存器,此时R0寄存器的值变成45,由于是十六进制存储的,因此显示为2D。

3.然后执行STR R0, [SP],将R0的值入栈,由于前面已经设置了栈顶地址为0x1000,因此可以查看到内存地址0x100处的数据变成了2D。

4.然后执行MOV R0, #y,把y的值赋值给了R0寄存器,此时R0寄存器的值变成64,由于是十六进制存储的,因此显示为40。

5.然后执行LDR R1, [SP],该数据出栈,将数据赋值给R1,此时R1中保存的值为2D。

6.然后执行ADD R0, R0, R1,其含义相当于R0=R0+R1,因此R0寄存器的值为2D+40 = 6D。

7.最后执行STR R0, [SP, #4],先执行SP+4,将指针进行偏移,再将R0的值复制到此时SP指向的地址0x1004,该数据赋值为6D。

最后程序执行完成后各相关寄存器及存储器单元的具体内容如下:

寄存器:

  • R0内容为0x6D,
  • R1内容为0x2D,
  • SP内容为0x1000,

存储器单元:

  • 0x1000内容为0x2D,
  • 0x1004内容为0x6D。

练习题

编写程序实现对一段数据的最大值最小值搜索,最大值存于max变量之中,最小值存于min变量之中。

提示: 数据的定义采用伪指令:DCD来实现,如:

DataBuf DCD 11,-2,35,47,96,63,128,-23

搜索最大值和最小值可以利用两个寄存器R1,R2来存放。用到的比较指令为CMP,用到的条件标识符小于为LT,大于为GT。

基本思路为:利用R0做基地址,将R1,R2分别存入第一个单元的内容,利用R3做循环计数器,利用R4遍历读取第2至最后一个数据,如果R1的数据小于新读入的R4数据则将R4的内容存入R1, 如果R2的内容大于R4的内容则将R4的内容存入R2。遍历完成之后,R1将存放最大数据,R2将存放最小数据。

 AREA comp,CODE,READONLY ;定义CODE片段comp 只读
 ENTRY           ;进入程序
 CODE32          ;以下为32位的ARM程序
START         
  LDR R0, = DAT      ;加载数据段中DAT的数据的地址到R0
  LDR R1, [R0]       ;加载R0的内容到R1
  LDR R2, [R0]       ;加载R0的内容到R1
  MOV R3,#1        ;设置循环变量R3并初始化为1
LOOP
  ADD R0,R0,#4       ;每次循环R0+4
  LDR R4,[R0]      ;R4存入R0的数据
  CMP R1,R4        ;比较R1,R4
  MOVLT R1,R4      ;如果R1<R4 就把R4存入R1
  CMP R2,R4        ;比较R2,R4
  MOVGT R2,R4      ;如果R2>R4 就把R4存入R2
  ADD R3,R3,#1       ;每次循环R3值加一
  CMP R3,#8        ;判断R3与8
  BLT LOOP         ;如果R3 < 8则跳转到LOOP执行
 B .           ;退出
 AREA D,DATA,READONLY  ;定义一个数据段D,读写
DAT DCD 11,-2,35,47,96,63,128,-23
 END

实验结果如下:

程序的基本思路是将DataBuf的首地址装载到R0中,再通过首地址将第一个数据装载到R1和R2中,设定R3为循环变量,并且初始化为1。然后进入循环,通过循环比较,将比较过程中得到的最大值放在R1中,最小值放在R2中,每一次循环R3中的值加1,当R3=8时,比较循环结束。

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

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

相关文章

【招聘】永善县社会科学界联合会招办公室文秘人员2名

【招聘】永善县社会科学界联合会招办公室文秘人员2名 因工作需要&#xff0c;根据《永善县人力资源和社会保障局关于做好2021年公益性岗位开发管理的通知》(永人社发〔2020〕34号)文件要求&#xff0c;现面向社会公开招聘公益性岗位工作人员&#xff0c;现通告如下&#xff1a…

锐捷(十五)mpls vxn跨域optionc场景

一 实验拓扑二 实验需求ce1和ce2为两个分公司&#xff0c;要求两个分公司之间用mpls vxn 进行通信&#xff0c;组网方式是optionc。三 实验分析optionc在转发平面上有点难理解&#xff0c;有一些关键点需要注意&#xff0c;大家点击链接可以参考我上篇发过的一个文章&#xff1…

前端md5加盐加密

为什么需要加密 前端在进行用户登录时&#xff0c;密码的传输如果使用明文&#xff0c;在报文被拦截之后即可直接获取传输的数据&#xff0c;明文密码被拦截会十分危险&#xff0c;因此在传输密码前时常对密码进行加密。 MD5 MD5的作用是让大容量信息在用数字签名软件签署私…

植物大战 List——C++

这里写目录标题vector和stirng的细节对于stringlist的使用list的迭代器反向迭代器构造函数关于list::sort的排序uniquelist的底层模拟实现结点类的实现迭代器模拟实现list实现插入的实现迭代器失效inserterase析构函数拷贝构造赋值构造函数vector和stirng的细节 复习vector的深…

全网详细总结com.alibaba.fastjson.JSONException: syntax error, position at xxx常见错误方式

文章目录1. 复现问题2. 分析问题3. 解决问题4. 该错误的其他解决方法5. 重要补充1. 复现问题 今天在JSONObject.parse(json)这个方法时&#xff0c;却报出如下错误&#xff1a; com.alibaba.fastjson.JSONException: syntax error, position at 0, name usernameat com.aliba…

Web自动化测试——Junit5篇

文章目录一、相关依赖注入二、注解调用三、断言 Assert四、规定用例执行顺序五、高效参数化1&#xff09;单参数2&#xff09;多参数3&#xff09;文件获取参数4&#xff09;方法获取数据&#xff08;动态参数&#xff09;六、测试套件整活Junit 是一个面向 Java 语言的单元测试…

网络安全-协议爆破-xhydra

网络安全-协议爆破-xhydra 啥叫爆破呢&#xff0c;当你忘记密码了&#xff0c;一个一个去猜想的时候&#xff0c;这个东东就叫暴力破解 简称爆破&#xff0c;而且用程序的组合去一个一个试&#xff0c;时间问题&#xff0c;总有尝试到的那天 爆破前需求 也就是说满足了什么…

数据库测试的认知和分类

数据库测试的认知和分类 目录&#xff1a;导读 系统测试 集成测试 单元测试 功能测试 数据库性能 性能优化分4部分 安全测试 现在的软件系统&#xff0c;尤其是业务应用系统&#xff0c;后台都连接着一个数据库。数据库中存储了大量的数据&#xff0c;数据库的设计是否…

完整爬虫学习笔记(第一章)

文章目录前言:fu:. 爬虫概述:hotdog:原理解剖:one: 服务器渲染:two: 前端JS渲染:fire: 第一个爬虫程序案例总结前言 最近正在学习Python网络爬虫的相关知识&#xff0c;鉴于本人Python水平有限 , 对Python并无太深的理解&#xff0c;所以此文章的主要目的在于抛砖引玉&#xf…

C语言(ANSI C类型限定符)

目录 1.const(恒常性) 2.volatile 3.restrict 1.const(恒常性) 如果我们想处理一个基本类型时&#xff0c;我们可以选择传递类型变量值或类型变量的地址。但有的时候我们传入地址但不想让其修改地址上面存储的值&#xff0c;那么就可以用到const。 这个时候const的作用就到了。…

Ansys Speos | 基于 Workbench 和 Speos 的准直全反射透镜优化设计案例

概述 基于Ansys Speos软件&#xff0c;可以准确建立光学系统模型并进行成像效果仿真。在使用Speos进行光学系统设计过程中&#xff0c;当完成初始光学系统建模后&#xff0c;还需要进一步结合仿真结果&#xff0c;调整出满足设计要求的系统参数&#xff0c;如果采用手动调整参…

香农 | 流行潮(bandwagon)

【编者按&#xff1a;面对当前的Chatgpt热潮&#xff0c;该如何看待呢&#xff1f;英语当中有种说法叫 jump on the bandwagon&#xff0c;意为跟风随大流。60多年前&#xff0c;当信息论的发展进入越来越多的领域&#xff0c;一向低调的香农在《流行潮》&#xff08;The Bandw…

Linux 游戏性能谁的 更优秀X.Org还是Wayland!

导读X.Org 和 Wayland 是目前 Linux 平台上的两大主流显示服务器&#xff0c;那么两者在 Linux 游戏性能上谁更优秀呢&#xff1f;国外科技媒体 Phoronix 在 Ubuntu 22.10 上对其进行了多款游戏的实测。评测在运行 GNOME 43.1 的 Ubuntu 22.10 上进行测试&#xff0c;在安装英伟…

基于QT5.14.2的MQTT通信

一、概述 默认的Qt环境是不能使用MQTT的&#xff0c;但Qt官方提供了基于MQTT的封装&#xff0c;需要通过源码进行编译。 可以在下面的链接中获取到&#xff1a; https://github.com/qt/qtmqtt 在dev分支中可以选择MQTT版本&#xff0c;选择最新的下载到本地。注意一定要选择对…

Video Speed Controller谷歌视频加速插件——16倍速

文章目录前言最简单的版本一、如果是简单的话 可以Microsoft Edge使用二、简单的版本 火狐的话使用Global Speed插件三、由于视频受限以上的方法行不通 还是谷歌好用前言 主要是网课刷的时候 太慢所以找到了刷视频的方法 由于前几个的权限受限制 所以还是选用了谷歌浏览器的 V…

Ambire Wallet 2023 年路线图

在一个充满活力的建设者空间&#xff0c;但在一个努力的熊市中&#xff0c;作为加密技术创新者&#xff0c;我们必须保持适应&#xff0c;同时继续通过做好工作来领导&#xff1a;建立愿景。 已经建设了很多&#xff0c;也还有很多要做的&#xff1a;Ambire 发布了今年的雷达图…

炎症回路和肠道微生物

✦ ✦ ✦ 炎症&#xff1a;就是平时人们所说的“发炎”&#xff0c;是机体对于刺激的一种防御反应。炎症&#xff0c;可以是感染引起的感染性炎症&#xff0c;也可以不是由于感染引起的非感染性炎症。 炎症在在各种症状中起重要作用&#xff0c;如脑雾、焦虑和抑郁、腹胀、各种…

数据工程师需要具备哪些技能?

成为数据工程师需要具备哪些技能&#xff1f;数据工程工作存在于各个行业&#xff0c;在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位&#xff0c;但如果有合适的经验学位往往没那么重要。 大数据开发…

linux高级命令之用户组相关操作

用户组相关操作学习目标能够知道创建用户组的命令1. 创建用户组命令说明groupadd创建(添加)用户组创建用户组效果图:2. 创建用户并指定用户组创建用户并指定用户组效果图:3. 修改用户组修改用户组效果图:4. 删除用户组命令说明groupdel删除用户组删除用户组效果图:说明:如果用户…

Git-学习记录

文章目录1. Git-基础1.1 获取 Git 仓库1.2 记录每次更新到仓库1.3 远程仓库的使用2. Git-分支2.1 Git 分支的新建与合并2.2 Git 分支的管理1. Git-基础 1.1 获取 Git 仓库 通常有两种获取 Git 项目仓库的方式&#xff1a; 将尚未进行版本控制的本地目录转换为 Git 仓库&…