实验目的
熟悉实验开发环境,掌握简单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
暂无评论内容