山东大学嵌入式实验:ARM汇编指令实验1-简单数据搬移实验

实验目的

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

实验环境

硬件:PC 机

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

实验内容

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

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

实验要求

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

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

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

实验代码:

 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中的值(x的值)入栈
      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  ;程序结束

练习题

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

提示: 数据的定义采用伪指令:DCD 来实现, DCD (DCDU) 用于分配一片连续的字存储单元并用指定的数据初始化。

例如DataTest DCD 4 , 5 , 6 ;分配一片连续的字存储单元并初始化。

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

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

实验代码:

 AREA Init,CODE,READONLY
 ENTRY
 CODE32
start
 LDR R0,=DataBuf    ;把数组首地址赋给R0,即用R0做基地址
 LDR R1,[R0],#4      ;数组的第一个值赋给R1,第2个值存入R0  
 MOV R2,R1          ;数组的第一个值赋给R2
 MOV R3,#8          ;R3做循环计数器,赋值为8
loop
 SUB R3,R3,#1       ;R3自减1
 CMP R3,#0          ;R3与0比较          
 BEQ over           ;R3等于0则跳转到over,程序结束
 LDR R4,[R0],#4     ;把数组中的第二个数赋给R4,并将R0+4的值存入R0(指向下一个数)     
 CMP R1,R4
 BGT min            ;R1>R4则跳转到min
 MOV R1,R4          ;R1存放最大值
min
 CMP R2,R4          
 BLT loop           ;R2<R4则跳转到loop
 MOV R2,R4          ;R2存放最小值
 B loop
over
 B .
 AREA Array,DATA,READWRITE
DataBuf DCD -3,-2,-1,0,1,2,3,-4 END
© 版权声明
THE END
喜欢就支持以下吧
点赞0赞赏
分享
评论 抢沙发

请登录后发表评论