carry
发布于 2024-05-01 / 20 阅读
0
0

使用stm32f103c8t6完成《嵌入式技术与基础 第六版》相关内容博客作业2 运行汇编

使用stm32f103c8t6完成《嵌入式技术与基础 第六版》相关内容博客作业2 运行汇编

零、 创新点

《嵌入式技术与基础 第六版》原书教材随书附赠了一块stm32L431的开发板,配套内容都是以此为基础打造的,甚至作者还专门为此开发了一套ide,但是:

  • 现在stm32主流的教程生态用的都是stm32f103c8t6这款芯片,原书的教程虽然能很好的为你解释嵌入式开发的原理,但是要进一步学习,你还是不得不寻找其他教程,购买主流的开发板
  • 作者的ide完全是出于本书学习设计的,对于实际开发毫无意义,若将来想做点嵌入式,还需要重新学习一套开发栈
  • 全新套书卖100。作为抠门带血生,肯定要考虑二手的,但是二手书通常不会带有原书的附件。单买开发板,某宝60,某鱼甚至没有。起码截至我使用该书学习的时间(2024年3月)是这样的,后期使用此书的前辈多了,估计二手市场会变好。
  • 最重要的是,我已经有一个stm32f103c8t6的开发板了

综上,无论是从学习角度还是省钱角度,使用stm32f103c8t6完成《嵌入式技术与基础 第六版》相关内容都是非常合适的

这套博客是广州大学计算机学院嵌入式系统课程的作业,我用stm32f103c8t6开荒,也是为了后来的同学做贡献

一、 基础知识:C嵌入汇编

stm32 cube ide高度整合,不方便直接用汇编写主函数,但是,我们可以使用c语言语法的嵌入汇编

在C语言中,内联汇编通常使用asm​关键字来声明。对于ARM架构,内联汇编的语法如下:

asm (
"汇编指令"
: 输出操作数
: 输入操作数
: 被破坏的寄存器列表
);
  • asm​ :用于声明内联汇编代码块。
  • 汇编指令​:实际的ARM汇编指令。
  • 输出操作数​:定义汇编代码的输出,格式为 "=约束"(变量名)​。
  • 输入操作数​:定义汇编代码的输入,格式为 "约束"(变量名)​。
  • 被破坏的寄存器列表​:可选,用于告诉编译器这段汇编代码可能会修改哪些寄存器,以便编译器在后续的代码中正确使用这些寄存器。

二、 我的实现

写一个1到10的累加计算样例

int sumresult = 0;
asm(
    "MOV r1, #1\n"   // 将寄存器r1的值设置为1,这是我们的起始值
    "MOV r2, #0\n"   // 将寄存器r2的值设置为0,用于累加求和
    "loop:\n"        // loop是汇编代码中的一个标签,用于表示循环的开始
    "add r2, r2, r1\n" // 将r1的值加到r2上,实现累加
    "add r1, r1, #1\n" // r1的值增加1,相当于计数器加1
    "CMP r1, #11\n"  // 将r1的值与11比较
    "BNE loop\n"     // 如果r1的值不等于11,则跳转到loop标签处继续执行循环,否则跳出循环
    "MOV %[sumresult], r2\n" // 循环结束后,将r2的值(求和结果)移动到C语言中的sumresult变量
    : [sumresult] "=r" (sumresult)    // 输出操作数,将r2的值输出到sumresult变量
    :                             // 输入操作数,这里没有输入操作数
    : "r1", "r2"                  // 提示编译器r1和r2寄存器会被这个内联汇编代码修改
);
printf("Sum from 1 to 10 is: %d\n", sumresult);

三、 效果展示

计算结果正确

image

关于作者:

欢迎联系!


评论