实例程序学习
打开04-Software/ch02/CH02-1-20220118工程目录07 AppPrg/main.s源程序。
学习该源程序
编写示例程序:datax、datay、dataz三个数中,找出最大值并显示。
将该语句段放在main.s中“main loop:”前位置
步骤:
1.打开“金葫芦”,导入工程。
(我的工程路径:D:\AHL-IDE\AHL-MCU6-V2.0-20240118\AHL-MCU6-V2.0-20240118\04-Software\CH02\CH02-1-20220118)
2.编写示例程序:datax、datay、dataz三个数中,找出最大值并显示。
先定义变量,找到定义位置:
增加新代码:
//增加:定义变量x,y,z(ps:数字自定义)
datax:
.word 18//x=18
datay:
.word 0x654123//y
dataz:
.word 56800//z=56800
datamax:
.space 4
data_format5:
.ascii "最大数字是:%d\n\0"
3.在main_loop前增加代码:
这段代码的大致逻辑是:
从 datax 和 datay 读取两个值到 r2 和 r3。
比较这两个值,如果 r2 大于或等于 r3,则保持 r2 不变,否则将 r3 的值赋给 r2。
然后,从 dataz 读取一个值到 r3。
再次比较 r2 和 r3,如果 r2 大于或等于 r3,则保持 r2 不变,否则将 r3 的值赋给 r2。
最后,将 r2 的值存储到 datamax 指向的地址。
调用 printf 函数,输出 data_format5 指向的格式字符串和 datamax 指向的值。
bl . 是一个无限循环调用,通常用于调试,可以设置一个断点来观察程序在此处的状态。在实际的程序中,这样的无限循环调用是不合适的,除非有特定的调试需求。
// 加载 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 . // 在此打桩(.表示当前地址)
左上角编译-下载-连接GEC-串口更新-选择Debug文件夹的“.hex”文件-一键串口更新:
结果: