实验一 ARM 汇编实验 1—简单数据搬移实验
定义两个变量 x,y 和堆栈地址 0x1000,将变量 x 的内容存到堆栈
顶,然后计算 x+y,并将和存到堆栈的下一个单元
AREA Init,CODE,READONLY ; 定义一个名为 Init 的代码区,
且该区是只读的
ENTRY ; 标记程序的入口点
CODE32 ; 指示接下来的代码使用 32 位的 ARM 指令集
x EQU 45 ; 定义一个常量 x,值为 45
y EQU 64 ; 定义一个常量 y,值为 64
stack_top EQU 0x1000 ; 定义栈顶的地址为 0x1000
start ; 程序的开始标签
MOV SP, #stack_top ; 将栈顶地址赋值给栈指针 SP
MOV R0, #x ; 将常量 x 的值(45)给 R0
STR R0, [SP] ; Store Register,将 R0 中的值
(45)存储到 SP 指向的内存地址(栈顶)
MOV R0, #y ; 将常量 y 的值(64)移动到寄存
器 R0 中
LDR R1, [SP] ; 将 SP 指向的内存地址(栈顶)的值(45)
加载到寄存器 R1 中
ADD R0, R0, R1 ; 将 R0 和 R1 中 的 值 相 加
(64+45),结果存回 R0
STR R0, [SP,#4] ; 将 R0 中的结果(109)存储到
SP+4 指向的内存地址(栈顶的下一个位置)
B . ; 跳转到当前指令,形成无限循环(点表示当前地址)
END ; 程序的结束
;ARM 处理器是 32 位,所以 SP 以 4 字节倍数变化
编写程序实现对一段数据的最大值最小值搜索,最大值存
于 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 lianxi, CODE, READONLY;声明代码段
ENTRY;程序入口
CODE32
start
LDR R0, =DataBuf ; R0 作为基地址,指向数据
缓冲区的开始
LDR R1, [R0] ; R1 存储最大值,初始化为数组的
第一个元素
LDR R2, [R0] ; R2 存储最小值,初始化为数组的
第一个元素
MOV R3, #8 ; R3 作为循环计数器,数据总数减 1
find_max_min
CMP R3, #0 ; 检查计数器是否为 0
BEQ finish ; 如果为 0,完成循环
LDR R4, [R0] ; R4 读取当前元素
CMP R4, R1 ; 比较 R4 和当前最大值
R1
BLE skip_max ; 如果 R4 小于等于 R1,跳过
更新最大值
MOV R1, R4 ; 更新最大值
skip_max
CMP R4, R2 ; 比较 R4 和当前最小值
R2
BGT skip_min ; 如果 R4 大于 R2,跳过更
新最小值
MOV R2, R4 ; 更新最小值
skip_min
SUBS R3, R3, #1 ; 循环计数器减 1
ADD R0,R0,#4 ;指向下一个数值
B find_max_min ; 继续循环
finish
; 最终结果,最大值在 R1,最小值在 R2
B . ; 无限循环,等待中断
DataBuf
DCD 11, -2, 35, 47, 96, 63, 128, -23
END
;BLE--Less Than or Equal
;BGT--Greater Than
调试:
最终结果为:最大值 0x80 即 128 在 R1,最小值 0xFFFFFFE9
即-23 在 R2
实验二 ARM 汇编指令实验 2—字符串拷贝实验
定义两个数据存 储区 Src 和 Dst,Src 用于存放原字符串,Dst
用于存放目的字符串。堆栈地址 0x400, 将变量原字符串的内
容拷贝到目的字符串中,要能判断原字符串的结束符(0),并
统计字符串中字符的个数。
AREA Init,CODE,READONLY ;代码段,只读
ENTRY ;入口