文章和代码已归档至【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解读,我的项目源码,面经总结。