C语言本质
1.ARM架构与汇编简明教程
- 硬件结构
注:写一个程序,通过Keil或编译器烧写到Flash,转变成三条汇编指令(机器码),上电CPU取指令。 - ARM汇编指令
2.变量是什么
-
变量变量,能变,就能读能写,必定在内存里,必定有一个地址,一个字节对应一个地址
-
全局变量、局部静态变量:如何分配空间、如何赋初始值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
需要自己写代码,从flash把初始值复制到内存中的地址当中。地址怎么来的?自己分配的,由链接器的参数决定地址(test.bin),按照基地址,根据变量在程序中的位置,确定全局变量在内存中的地址(由下往上)。为了线程(每个线程都有自己的栈)安全,尽量不用全局变量。DATA段的内存大小由有初值的全局/静态变量决定,存的是非零的全局变量的初始值;ZI段由无初值或初值为0的全局/静态变量决定。 -
局部变量:如何分配空间,如何赋初始值
在栈中,按照字节(变量类型)大小,从栈顶(高)开始往下(低)分配(满减),通过机器语言分配,先调整,再满减,SP-4。
栈PUSH
栈POP(比方调用函数,函数中的局部变量用完之后空间就被释放)
3.栈和堆
堆:就是一块空闲内存,可以使用malloc/free函数来管理它。
栈:开始也是空闲的,除了基地址,控制不了它的运行,完全由机器操作。
char *str;
str = malloc(100);
strcpy(str,"sadjasdjs");
free(str);
4.函数是什么
- 就是一系列的指令:一系列机器码
- 调用函数:让CPU的PC寄存器等于“一系列机器码”的首地址,就是函数地址
- 怎么传递参数
- 子函数无法修改实参?
传递实参,相当于传递实参的副本,即只是把实参的数值拿出来,把数值赋给一个寄存器,然后函数会去使用一个寄存器,修修改改都跟实参无关。 - 怎么让子函数修改调用者的变量?
传递地址。
- 子函数无法修改实参?
5.指针
- 指针变量,也是一个变量,存放的是“首地址”
- 使用指针的本质:使用地址访问变量
- 函数指针的本质