03 第2章作业 | 嵌入式

126 阅读3分钟
  • 打开04-Software/ch02/CH02-1-20220118工程目录,编译下载运行,理解并学习main.s汇编源文件

image-20240324140612640.png

image-20240324140848388.png
  • 写出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 .

补充修改后再次编译 image-20240324155107140.png

串口更新后得到结果: image-20240324160621352.png

image.png