实例程序学习
打开04-Software/ch02/CH02-1-20220118工程目录07 AppPrg/main.s源程序。
学习该源程序
编写示例程序:datax、datay、dataz三个数中,找出最大值并显示。
将该语句段放在main.s中“main loop:”前位置
实验步骤:
1.打开金葫芦,导入工程(D:\嵌入式\AHL-MCU6-V2.0-20240118\04-Software\CH02\CH02-1-20220118)
2.编写要求程序:datax、datay、dataz三个数中,找出最大值并显示。程序如下:
3.在main loop前增加代码如下:
完整代码如下:
//增加代码:
// 加载 datax 地址到 r1 寄存器
ldr r1, =datax
// 从 r1 指向的地址加载数据到 r2 寄存器
ldr r2, [r1]
// 加载 datay 地址到 r1 寄存器
ldr r1, =datay
// 从 r1 指向的地址加载数据到 r3 寄存器
ldr r3, [r1]
// 比较 r2 和 r3 寄存器的值
cmp r2, r3
// 如果 r2 大于或等于 r3,跳转到 mytag1 标签处执行
bge mytag1
// 如果 r2 小于 r3,则执行下一条指令,即把 r3 的值赋给 r2
mov r2, r3
// mytag1 标签位置
mytag1:
// 加载 dataz 地址到 r1 寄存器
ldr r1, =dataz
// 从 r1 指向的地址加载数据到 r3 寄存器
ldr r3, [r1]
// 比较 r2 和 r3 寄存器的值
cmp r2, r3
// 如果 r2 大于或等于 r3,跳转到 mytag2 标签处执行
bge mytag2
// 如果 r2 小于 r3,则执行下一条指令,即把 r3 的值赋给 r2
mov r2, r3
// mytag2 标签位置
mytag2:
// 加载 datamax 地址到 r1 寄存器
ldr r1, =datamax
// 将 r2 寄存器的值存储到 r1 指向的地址处
str r2, [r1]
// 加载 data_format5 地址到 r0 寄存器,该地址可能指向一个格式字符串
ldr r0, =data_format5
// 加载 datamax 地址到 r2 寄存器
ldr r2, =datamax
// 从 r2 指向的地址加载数据到 r1 寄存器
ldr r1, [r2]
// 调用 printf 函数,将 r0 指向的格式字符串和 r1 指向的值作为参数
bl printf
// 调用当前地址,通常用于调试目的,例如设置断点
bl . // 在此打桩(.表示当前地址)
代码解释:
从 datax 和 datay 中读取到两个值到r2 和 r3。
先比较这两个值,如果 r2 大于或等于 r3,则保持 r2 不变,否则将 r3 的值赋给 r2。
然后,再从 dataz 读取一个值到 r3。
再次比较 r2 和 r3,如果 r2 大于或等于 r3,则保持 r2 不变,否则将 r3 的值赋给 r2。
最后,就将 r2 的值存到 datamax 指向的地址。
调用 printf 函数,输出 data_format5 指向的格式字符串和 datamax 指向的值。
然后左上角编译-编译工程:
4.左上角-下载 -串口更新-连接GEC-选择debug的.hex文件-一键自动更新,实验结果如下图:
实验完成!