CPU中的一些特殊寄存器:
R13 | 堆栈指针,SP |
R14 | 程序链接寄存器,LR(返回地址) |
R15 | 程序计数器PC(下一条将要执行指令的地址) |
几个常用汇编指令:
指令 | 例子 | 解释 |
---|---|---|
读Load | LDR R0 , [addrx] | CPU从RAM中addrx地址里读出数据存放到R0里 |
写Store | STR R0 , [addrx] | CPU把R0中的数据读到RAM中addrx地址处 |
加ADD | ADD R0,R1,R2 | R0=R1+R2 |
写Push | Push {R3,LR} | 把R3,LR中的值写到SP指向的地址中 |
读Pop | Pop {R3,PC} | 把SP指向的地址数据依次读入RC和PC中 |
①写Push具体流程是,sp先向下自减4,再写入R3,花括号{}里寄存器的顺序可以乱排,CPU高标号的寄存器写入高地址,CPU低标号的寄存器写入低地址。
②读Pop具体流程是,先把sp指向的地址读入R3,sp向上自加4,再读出一个数据赋给PC。
举例:执行运算a=a+b
CPU怎么去执行任务?
比如 a=a+b ,程序写入flash里后,保存的是一些指令,CPU先从flash中读出指令,再从RAM中读写具体的变量数据,在CPU中进行计算。
怎么保存现场?
一. 现场:指的就是CPU寄存器的值。
二. 不同的切换任务的类型,保存现场的方式不同:
1.任务切换时,即不同程序之间的切换,CPU中所有寄存器的值都有可能改变,所以都要保存。
2.硬件中断时,硬件会自动保存一些寄存器,所以不必保存所有的现场。
3.A函数中执行B函数时,B函数用到的寄存器,对A来说不用保存。
注:现场(寄存器的值)保存在栈里。