写点什么

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

作者:timerring
  • 2023-02-14
    山东
  • 本文字数:1886 字

    阅读完需:约 6 分钟

文章和代码已归档至【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 45y EQU 64 ;定义两个变量 x,ystack_top EQU 0x1000 ;定义堆栈地址 0x1000start MOV SP, #stack_top  ;设置栈顶地址      MOV R0, #x  ;把x的值赋给R0      STR R0, [SP]  ;R0中的内容入栈MOV R0, #y  ;把y的值赋给R0LDR 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并初始化为1LOOP  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 时,比较循环结束。




欢迎关注公众号【AIShareLab】,一起交流更多相关知识,前沿算法,Paper 解读,项目源码,面经总结。

发布于: 2023-02-14阅读数: 22
用户头像

timerring

关注

公众号【AIShareLab】 2022-07-14 加入

公众号【AIShareLab】

评论

发布
暂无评论
嵌入式ARM设计编程(一) 简单数据搬移_arm_timerring_InfoQ写作社区