简单的单片机架构
ARM芯片的指令集是RISV,即精简指令集,具有:
1、对内存只有读、写指令
2、对数据的运算是在CPU内部实现
芯片读写运算的过程,例如a = a*b
那么CPU内部用什么来保存变量a、b的值呢?
这得深入CPU内部结构了
指令保存在芯片的FLASH上,数据保存在内存里
flash:
内存:
CPU内部寄存器:R0——R15
R13-SP寄存器, 保存栈指针
R14-LR寄存器, 保存返回地址
R15-程序计数器
一些简单的汇编指令
1、内存相关:
LDR R0, [R1, #4]
读地址“R1+4”,得到的四字节数据存入R0
STR R0, [R1, #4]
写地址,将R0的值写入"R1+4"的地址
2、CPU相关
ADD R0, R1, R2 //R0 = R1 + R2
SUB R0, R1, R2 //R0 = R1 - R2
3、比较
CMP R0, R1
比较R0, R1的值,比较的结果放在xPSR寄存器(程序状态寄存器)中
4、跳转
B main Branch,直接跳转,PC直接跳转
BL main Branch and Link,先把返回地址保存进LR寄存器中,再进行跳转
实例
C函数:
加入volatile防止编译器优化,这样容易看一点
add函数调用位置:
add函数的汇编代码:
调用add的代码的汇编码:
add函数的具体过程:
其中, r1寄存器保存常量1
r0保存变量cnt
然后跳转到add函数的执行代码
具体可以看
https://www.bilibili.com/video/BV1Jw411i7Fz?p=9&spm_id_from=pageDriver&vd_source=59b175c9e7602375c9a2564f595c9e1f