使用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);
三、 效果展示
计算结果正确
关于作者:
- 邮箱:luokairui@carry.fit
- 个人博客:carry blog
- CSDN主页:_:Carry-CSDN博客
- Github主页:C-a-r-r-y
欢迎联系!