wangxj_nemo 发表于 2012-5-4 11:56:47

x,y,z,m,哪几个需要压栈出栈处理?

vari x;

main()
{
    vari y;
    for(;;)
    {
      vari z;
      
      fun1();
      fun2();
      .
      .
      .
      fun3()
    }
}

fun3()
{
    vari m;
    fun4();
}

dragon_hn 发表于 2012-5-4 12:28:00

这个应该跟编译器以及程序复杂程度有关.
想你这样都是空函数的话,程序全部优化掉,变量都不存在,更不用说压栈.

你纠结这个是否压栈的问题意义不大,不知道你想干嘛.

wangxj_nemo 发表于 2012-5-4 12:55:16

dragon_hn 发表于 2012-5-4 12:28 static/image/common/back.gif
这个应该跟编译器以及程序复杂程度有关.
想你这样都是空函数的话,程序全部优化掉,变量都不存在,更不用说压 ...

只是个示意,考虑全局变量(main内main外),局部变量压栈出栈的问题,不考虑优化,纯理论的研究下,无聊之下的瞎想来着.......

machao 发表于 2012-5-5 00:36:00

基本概念混淆。
如果使用高级语言编写系统代码,基本上不需要你考虑什么压栈出栈的事情。
压栈出栈通常使用汇编语言编写子程序或中断代码时考虑的,常常作为现场保护和回复的手段。高级语言已经自动帮助你考虑了。

你是否不了解C中的全局和局部变量的使用?

wangxj_nemo 发表于 2012-5-5 10:01:41

machao 发表于 2012-5-5 00:36 static/image/common/back.gif
基本概念混淆。
如果使用高级语言编写系统代码,基本上不需要你考虑什么压栈出栈的事情。
压栈出栈通常使用 ...

好吧,我说我的想法:
1,x是全局变量,任何时候,它都不涉及出栈入栈的问题,
2,代码从main进入fun1的时候,y和z貌似是局部变量(main内的局部变量),但是main函数和fun1,fun2等函数不同,y,z其实等同于全局变量的地位或者说它们就是全局变量,没有出栈入栈的问题,
3,代码从fun3进入fun4的时候,局部变量m会入栈,fun4运行完后m出栈,

好久不写汇编代码,生疏了,对这些底层的东西也没详究,今天心血来潮心怀忐忑的提个问,望高人不吝赐教,批评之余顺便帮我理理清楚吧.

单片机玩C++ 发表于 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一样。



machao 发表于 2012-5-17 14:17:22

面前国内尚没有培养真正能写编译器的人才的学校和导师专业。对于类似8位控制器的编译器和一般的处理器还是不同的,要根据控制器资源选择不同的方式。实际上比80X86的编译器要复杂和困难。

51的KEIL,缺省的函数是不可重入的,而AVR的几个编译器,ICC\CVAVR\IAR的函数,都是可以重入的,就是典型的例子。就是ICC\CVAVR\IAR对AVR内存的分配和使用也是不一样的。

wangxj_nemo 发表于 2012-6-6 20:46:29

单片机玩C++ 发表于 2012-5-15 08:31 static/image/common/back.gif
一般编译器使用寄存器,会将寄存器分成几个类别,如草稿寄存器,存储寄存器,特殊功能寄存器。
特殊功能寄 ...

灰常漂亮的回复,谢过。{:3_46:}

wangxj_nemo 发表于 2012-6-6 20:49:50

单片机玩C++ 发表于 2012-5-15 08:31 static/image/common/back.gif
一般编译器使用寄存器,会将寄存器分成几个类别,如草稿寄存器,存储寄存器,特殊功能寄存器。
特殊功能寄 ...

咋还加不了兄台为好友,最近正好有个STM32的东西想用下C++实现串口的玩法,扣扣几何哦?
页: [1]
查看完整版本: x,y,z,m,哪几个需要压栈出栈处理?