计算机怎么执行程序
1、在cpu、内存、flash三者之间相互合作
cpu分两个部分:一个是负责存放各种中间变量之类的16个寄存器,另一个负责运算
内存:存放各种数据
flash:存放代码,用c语言编写,最后编译成机器码
CPU运行时,先去取得指令,再执行指令:
① 把内存a的值读入CPU寄存器R0
② 把内存b的值读入CPU寄存器R1
③ 把R0、R1累加,存入R0
④ 把R0的值写入内存a
下面是我们的cpu的全部寄存器的说明
汇编指令
加载/存储指令(LDR/STR)
加载指令LDR(读): LDR r0,[addrA] 意思是将地址addrA的内容加载(存放)到r0里面
存储指令STR(写): STR r0,[addrA] 意思是将r0中的值存储到地址addrA上
读写的话我们要注意三个地方
1、从哪里读
2、读到哪里
3、长度多少
LDR r0,[addrA] :表示去地址为addrA的内存读取数据,放到R0中,LDR默认是4个byte
CPU执行LDR RO,[R3]的时候,先通过地址线找到地址R3代表的内存
再通过数据线读写数据
加法运算指令(ADD)
加法运算指令(ADD): ADD r0,r1,r2 意思为:r0=r1+r2
减法运算指令(SUB): SUB r0,r1,r2 意思为:r0=r1-r
寄存器入栈/出栈指令(PUSH/POP)
. 寄存器入栈(PUSH): PUSH {r3,lr} 意思是将寄存器r3和pc写入内存栈
. 本质是写内存STR指令,高标号寄存器写入高地址的栈里,低标号寄存器写入低地址的栈里
. lr即r14,写入地址为 sp-4 的内存,然后:sp=sp-4
r3,写入地址为 sp-4 的内存,然后:sp=sp-4
个人理解:
sp指向最顶部
我们先把R0放到的Sp-4位置,再把栈顶指针sp指针减四下压,
下次我们要再压入一个的时候还是和上面一样,将R1放到sp-4,最后把栈顶指针sp减四下移
> - 寄存器出栈指令(POP): `POP {r3,pc}` 意思是取出内存栈的数据放入r3和pc中
> * 本质是读内存LDR指令,高标号寄存器的内容来自高地址的栈,低标号寄存器的内容来自低地址的栈
> * 读地址为`sp`的内存存入r3,然后:sp=sp+4
> * 读地址为`sp`的内存存入pc,然后:sp=sp+4
个人理解:
sp指向如上图所示
我们想把R1推出栈,就让sp自己加4,就会吧R1顶出去
还想把R0推出去就继续sp自加4
字符串传送指令 movs
格式 :MOVS OPRD1,OPRD2
功能:OPRD1<----OPRD2
将右边的值复制给左边的值