|
发表于 2012-5-15 08:31:46
|
显示全部楼层
本帖最后由 单片机玩C++ 于 2012-5-15 08:48 编辑
一般编译器使用寄存器,会将寄存器分成几个类别,如草稿寄存器,存储寄存器,特殊功能寄存器。
特殊功能寄存器暂不讨论。
草稿寄存器:编译器可以任意使用,使用前不需要保护(中断保护现场除外)。
存储寄存器:编译器使用的时候,需要先保护里面的类容。
回到楼主的话题:
1,x是全局变量,任何时候,它都不涉及出栈入栈的问题,
------------------------------------------------------------------------
也不完全一定。x是全局变量,但访问x仍然需要通过寄存器。
x不会入栈,但访问x可能会影响到其他存储寄存器,局部变量入栈。
2,代码从main进入fun1的时候,y和z貌似是局部变量(main内的局部变量),但是main函数和fun1,fun2等函数不同,y,z其实等同于全局变量的地位或者说它们就是全局变量,没有出栈入栈的问题,
-------------------------------------------------------------------------------------------------------------------------------------
y和z是局部变量,但生存周期与全局变量一样(只要main函数不返回),
但是y和z本身并不是全局变量,其存储空间仍然是寄存器或者堆栈。
y和z需不需要入栈,这要看调用fun1,fun2之后,y,z的值有没有意义。
如果没有意义,那么编译器会把y,z分配草稿寄存器,不需要入栈。
如果有意义,main函数在后面又使用了变量y,z,那么y,z的值必须保护起来。一般情况下,编译器并不是直接把y,z入栈,
而是y,z复制到存储寄存器,或者在分配空间的时候,就直接分配到存储寄存器。这样访问y,z的速度更快。
当然,存储寄存器在使用前,需要先入栈。
3,代码从fun3进入fun4的时候,局部变量m会入栈,fun4运行完后m出栈,
----------------------------------------------------------------------------------------
这要看m在fun4运行之后,还有没有意义。
入不入栈跟问题2一样。
|
|