乐趣区

关于arm:嵌入式ARM设计编程一-简单数据搬移

文章和代码已归档至【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 时,比拟循环完结。


欢送关注公众号【AIShareLab】,一起交换更多相干常识,前沿算法,Paper 解读,我的项目源码,面经总结。

退出移动版