【教学目标和要求】

学习嵌入式汇编程序的设计方法,完成实验中数据搬移的功能。

【主要仪器设备和药品】

(1)硬件:微机

(2)软件:ADS1.2

【实验要求】

(1)按照实验要求编写汇编语言源程序。

(2)对汇编源程序进行编译、汇编。

(3)对程序进行调试。

(4)观察程序运行结果。

【实验程序】

(1)汇编程序:

本程序步骤:

首先将45移入R0中,然后入栈,再将64移入R0,将45出栈到R1中,再使R0=R0+R1=109,最后将R0中的相加结果入栈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  AREA Init,CODE,READONLY
ENTRY ;program entrance
CODE32 ;declare 32-bit ARM instruction
x EQU 45 ;the value of x
y EQU 64 ;the value of y
stack_top EQU 0x1000 ;define the top address for stacks
start MOV SP, #stack_top
MOV R0, #x ;R0 = x
STR R0, [SP] ;[SP] = R0
MOV R0, #y ;R0 = y
LDR R1, [SP] ;R1 = [SP]
ADD R0, R0, R1 ;R0 = R0 + R1
STR R0, [SP,#4] ;[SP+4] = R0
B .
END

【实验结果】

(1)调试界面

运行结果:

img

图 1 实验2最终运行内存和寄存器结果

【练习题】

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

提示: 数据的定义采用伪指令:DCD 来实现,如:

1
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 将存放最小数据。

汇编程序:

程序首先将DataBuf的首地址装载到R0中,再通过首地址将第一个数据装载到R1和R2中,以R3为循环计数器。通过不断的循环比较,将比较过程中得到的最大值放在R1中,最小值放在R2中,每一次循环R3中的值加1,当R3=8时,比较循环结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  AREA comp,CODE,READONLY
ENTRY ;program entrance
CODE32 ;declare 32-bit ARM instruction
start
LDR R0,=DataBuf
LDR R1,[R0]
LDR R2,[R0]
MOV R3,#1
LOOP
ADD R0,R0,#4 ;R0 = R0 + 4
LDR R4,[R0] ;R4 = [R0]
CMP R1,R4 ;
MOVLT R1,R4 ;if R1<R4: R1=R4 max
CMP R2,R4 ;
MOVGT R2,R4 ;if R2>R4: R2=R4 min
ADD R3,R3,#1 ;R3 = R3+1
CMP R3,#8 ;number = 8
BLT LOOP ;if R3<8 loop_number = 7
B .

AREA D,DATA,READONLY
DataBuf DCD 11,-2,35,47,96,63,128,-23
END

运行结果:

img

图 2 实验2练习题运行结果