一个应用程序的组成:bss, data, text, heap, stack
任何事物都是由比它更小的单位组成的,从物理学的角度来说就是什么原子(不知道现在对不对,学物理的尽管拍砖,哈哈), 一个汽车由4个轮子,发动机,底盘,车身,电气设备等组成,作为一个程序员应该知道一个程序有哪些部分组成的,不然......
1. text段, 就是代码段了,直观上看就是你码上去的东西,吧嗒吧嗒..... 因为你码上去编译之后就交给OS运行了,你不能在人家OS上运行中修改它吧,所以这个段是只读的
2. data段,data就是数据了,数据段, 顾名思义它里面存的是数据,这个数据是初始化的全局变量,初始化的用static修饰的变量也放在这里,会占用程序文本空间
int a[1024*1024] = {1};
void main (void)
{
printf("hello world\n");
}
3. bss段, bss: block started by symbol , 直译过来就是从符号开始的块, 它里面存储的是未初始化的全局变量,但不会占用程序文本空间
int a[1024*1024];
void main (void)
{
printf("hello world\n");
}
4. heap 堆,用malloc分配的内存就是它了,这个是在程序运行过程中动态分配的,所以不会占用程序文本空间
5. stack 栈,这里面存放的是临时变量,也就是你在函数中 int a; a就放在栈里,另外函数的形参也放在这里
1. 栈的整体作用
1) 保存现场;
2) 传递参数:汇编代码调用C函数时,需传递参数;
3) 保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量;
2. 详细解释
1) 保存现场
现场,意思就相当于案发现场,总有一些现场的情况,要记录下来的,否则被别人破坏掉之后,你就无法恢复现场了。而此处说的现场,就是指CPU运行的时候,用到了一些寄存器,比如r0,r1等等,对于这些寄存器的值,如果你不保存而直接跳转到子函数中去执行,那么很可能就被其破坏了,因为其函数执行也要用到这些寄存器。因此,在函数调用之前,应该将这些寄存器等现场,暂时保持起来(入栈push),等调用函数执行完毕返回后(出栈pop),再恢复现场。这样CPU就可以正确的继续执行了。保存寄存器的值,一般用的是push指令,将对应的某些寄存器的值,一个个放到栈中,把对应的值压入到栈里面,即所谓的压栈。然后待被调用的子函数执行完毕的时候,再调用pop,把栈中的一个个的值,赋值给对应的那些你刚开始压栈时用到的寄存器,把对应的值从栈中弹出去,即所谓的出栈。其中保存的寄存器中,也包括lr的值(因为用bl指令进行跳转的话,那么之前的PC的值是存在lr中的),然后在子程序执行完毕的时候,再把栈中的lr的值pop出来,赋值给PC,这样就实现了子函数的正确的返回。
2) 传递参数
C语言进行函数调用的时候,常常会传递给被调用的函数一些参数,对于这些C语言级
c语言学习笔记(狼牙整理) 来自淘豆网m.daumloan.com转载请标明出处.