- 打开04-Software/ch02/CH02-1-20220118工程目录,编译下载运行,理解并学习main.s汇编源文件
-
写出main.s中94~101行语句的C语言描述。
对94-101行语句进行了详细地注释解读
主要通过比较主循环次数
mMainLoopCount是否达到设定值MainLoopNUM,来控制程序的流程,达到设定值后进行灯的亮暗处理或其他操作//(2)======主循环部分(开头)===================================== main_loop: //主循环标签(开头) //(2.1)主循环次数变量mMainLoopCount+1 ldr r2,=mMainLoopCount //将 mMainLoopCount 变量的地址加载到寄存器 r2 中 ldr r1, [r2] //将 mMainLoopCount 变量的值加载到寄存器 r1 add r1,#1 //将寄存器 r1 中的值加1,即增加了主循环次数 str r1,[r2] //将寄存器 r1 中的新值存回 mMainLoopCount 变量的地址中,更新主循环次数 //(2.2)未达到主循环次数设定值,继续循环 ldr r2,=MainLoopNUM //将 MainLoopNUM 的地址加载到寄存器 r2 中 cmp r1,r2 //将寄存器 r1 中的值与 MainLoopNUM 的值比较 blO main_loop //未达到,继续循环 //(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理其逻辑对应的C语言描述为
#include <stdio.h> // 定义主循环次数变量和主循环设定值 int mMainLoopCount = 0; const int MainLoopNUM = 10; // 假设设定值为10 int main() { // 主循环 while (mMainLoopCount < MainLoopNUM) { mMainLoopCount++; // 主循环次数加1 } // 达到主循环设定值后,执行灯的亮暗处理 // 在这里添加相关的灯的亮暗处理代码 return 0; }
-
修改main.s源文件,增加以下内容:
1、在第一行显示“广州大学”字样。
2、编写一个1+2+...+10的程序,将求和结果存入名为“sumresult”的内存单元中,并将求和结果用printf显示出来。
注:建议在源程序中“main_loop: ”语句之前的地方增加,结束时用 ”bl .“ 停住。
printf的格式详见05_UserBoard/printf.h文件。
//======补充代码==================================================
.data
output_str:
.asciz "广州大学\n\0" //“广州大学”字样
sumresult:
.word 0 //用于计数
main:
//显示"广州大学"字样
ldr r0, =output_str
bl printf
// 计算1+2+...+10,并将结果存入sumresult
mov r1, #1 // 初始化计数器为1
mov r2, #0 // 初始化累加和为0
sum_loop: //主循环标签(开头)
cmp r1,#11 // 检查计数器是否超过10
bge sum_done // 如果超过10,跳转到sum_done
add r2, r2, r1 //累加到结果中
add r1, r1, #1 //计数器加一
b sum_loop //继续循环
sum_done:
//计算完成,将结果存入sumresult中
ldr r3, =sumresult
str r2,[r3]
//使用printf显示求和结果
ldr r0, =sumresult
ldr r0, [r0] //将sumresult的值加载到r0中
bl printf
//停止程序
bl .
补充修改后再次编译
串口更新后得到结果: