今天看了韦东山老师的一些课程,有了一些总结
我们可以知道CPU是通过地址总线去访问设备or模块的,然后可以通过数据总线得到数据,对于ARM芯片而言,对内存只有读,写功能,所以如果要得到a=a+b这样的等式,需要先把a,b读出来,之后在CPU里进行相加运算后得到a+b,之后再写入到内存里。如果要更具体地去了解,可以看看这幅图。
就是我们要明确CPU里面会有运算单元和寄存器,我们读操作是将内存数据读到寄存器(即图上R0-R15)处,然后我们之后将a,b两个值在CPU里相加,之后把他们加起来的值保存在CPU的另一个寄存器里,这些操作是基于我们写的代码,我们用c语言写的代码会被处理成汇编语言存放在FLASH(闪存,用于存放一些CPU最常使用的代码)里。
需要理解LDR和STR和ADD和SUB这四个汇编指令。
例如:LDR R0,[R1] ---这条指令说的是将R1所代表的值当成地址去读,例如如果R1=100,那我们就将地址为100处内存的值写入到我们的寄存器R0之中,注意不是直接将R1 的值写入R0,总之可以把'[]'符号当成取地址,R1的值其实代表的是地址值。此处不再赘述STR和ADD和SUB的具体意义了。
关于PUSH和POP指令,我们要先了解我们寄存器R13/R14/R15,R13是堆栈指针SP,栈的地址从上到下是由高到低的,我们令R13的值(即SP的值)等于最高位的栈地址xxx,之后我们执行PUSH{R0,R1},SP先执行SP=SP-4之后(执行-4的原因是因为首地址一般是所占内存的最低位),再将高标号的寄存器值(R1的值)放入栈里,之后再令SP=SP-4,再把R0的值放入栈里,总之PUSH会多次调用STR指令和SP,
POP就是会把栈里的值推出来,就例如我们刚刚把R0/R1放入栈里,我们要把R0的值推出栈,则先调用R0=[SP],把栈指针地址指向的值放入寄存器R0里,之后SP=SP+4到更高的地址处,之后再R1=[SP],再SP=SP+4【加减4 是因为栈地址之间相差4字节】
理解跳转指令BL,有两个作用.例如
BL A,
Bxxxxx
它会记录返回地址(即B处),这个地址保存在R14,之后执行A,执行完A后继续执行B