建门户网站需要多少钱,深圳网站备案点,网络培训学校,如何制作优秀的网页文章和代码已归档至【Github仓库#xff1a;hardware-tutorial】#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的
熟悉实验开发环境#xff0c;掌握简单ARM汇编指令的使用方法。
二、实验环境
硬件#xff1a;PC机
软件hardware-tutorial】需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的
熟悉实验开发环境掌握简单ARM汇编指令的使用方法。
二、实验环境
硬件PC机
软件ADS1.2 集成开发环境
三、实验内容
熟悉开发环境并使用LDR/STRMOV等指令访问寄存器或存储单元
使用ADD/SUB/LSL/LSR/AND/ORR等指令完成基本数学/逻辑运算。
四、实验要求
1按照2.3节介绍的方法, 在ADS下创建一个工程asmlab1定义两个变量x,y和堆栈地址0x1000将变量x的内容存到堆栈顶然后计算xy,并将和存到堆栈的下一个单元。通过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的值赋给R0STR R0, [SP] ;R0中的内容入栈
MOV R0, #y ;把y的值赋给R0
LDR R1, [SP] ; 数据出栈放入R1即R1中放x的值ADD R0, R0, R1 ;R0R0R1STR R0, [SP,#4] ;先执行SP4(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其含义相当于R0R0R1因此R0寄存器的值为2D40 6D。 7.最后执行STR R0, [SP, #4]先执行SP4将指针进行偏移再将R0的值复制到此时SP指向的地址0x1004该数据赋值为6D。 最后程序执行完成后各相关寄存器及存储器单元的具体内容如下
寄存器
R0内容为0x6DR1内容为0x2DSP内容为0x1000
存储器单元:
0x1000内容为0x2D0x1004内容为0x6D。
练习题
编写程序实现对一段数据的最大值最小值搜索,最大值存于max变量之中,最小值存于min变量之中。
提示: 数据的定义采用伪指令:DCD来实现,如:
DataBuf DCD 11,-2,35,47,96,63,128,-23搜索最大值和最小值可以利用两个寄存器R1R2来存放。用到的比较指令为CMP,用到的条件标识符小于为LT,大于为GT。
基本思路为利用R0做基地址将R1R2分别存入第一个单元的内容利用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的数据的地址到R0LDR R1, [R0] ;加载R0的内容到R1LDR R2, [R0] ;加载R0的内容到R1MOV R3,#1 ;设置循环变量R3并初始化为1
LOOPADD R0,R0,#4 ;每次循环R04LDR R4,[R0] ;R4存入R0的数据CMP R1,R4 ;比较R1,R4MOVLT R1,R4 ;如果R1R4 就把R4存入R1CMP R2,R4 ;比较R2R4MOVGT R2,R4 ;如果R2R4 就把R4存入R2ADD R3,R3,#1 ;每次循环R3值加一CMP R3,#8 ;判断R3与8BLT LOOP ;如果R3 8则跳转到LOOP执行B . ;退出AREA D,DATA,READONLY ;定义一个数据段D读写
DAT DCD 11,-2,35,47,96,63,128,-23END实验结果如下 程序的基本思路是将DataBuf的首地址装载到R0中再通过首地址将第一个数据装载到R1和R2中设定R3为循环变量并且初始化为1。然后进入循环通过循环比较将比较过程中得到的最大值放在R1中最小值放在R2中每一次循环R3中的值加1当R38时比较循环结束。