搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2012-5-4 11:56:47 | 显示全部楼层 |阅读模式
  1. vari x;

  2. main()
  3. {
  4.     vari y;
  5.     for(;;)
  6.     {
  7.         vari z;
  8.         
  9.         fun1();
  10.         fun2();
  11.         .
  12.         .
  13.         .
  14.         fun3()  
  15.     }
  16. }

  17. fun3()
  18. {
  19.     vari m;
  20.     fun4();
  21. }
复制代码

出0入0汤圆

发表于 2012-5-4 12:28:00 | 显示全部楼层
这个应该跟编译器以及程序复杂程度有关.
想你这样都是空函数的话,程序全部优化掉,变量都不存在,更不用说压栈.

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

出0入0汤圆

 楼主| 发表于 2012-5-4 12:55:16 | 显示全部楼层
dragon_hn 发表于 2012-5-4 12:28
这个应该跟编译器以及程序复杂程度有关.
想你这样都是空函数的话,程序全部优化掉,变量都不存在,更不用说压 ...

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2012-5-5 10:01:41 | 显示全部楼层
machao 发表于 2012-5-5 00:36
基本概念混淆。
如果使用高级语言编写系统代码,基本上不需要你考虑什么压栈出栈的事情。
压栈出栈通常使用 ...

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

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

出0入0汤圆

发表于 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一样。



出0入0汤圆

发表于 2012-5-17 14:17:22 | 显示全部楼层
面前国内尚没有培养真正能写编译器的人才的学校和导师专业。对于类似8位控制器的编译器和一般的处理器还是不同的,要根据控制器资源选择不同的方式。实际上比80X86的编译器要复杂和困难。

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

出0入0汤圆

 楼主| 发表于 2012-6-6 20:46:29 | 显示全部楼层
单片机玩C++ 发表于 2012-5-15 08:31
一般编译器使用寄存器,会将寄存器分成几个类别,如草稿寄存器,存储寄存器,特殊功能寄存器。
特殊功能寄 ...

灰常漂亮的回复,谢过。

出0入0汤圆

 楼主| 发表于 2012-6-6 20:49:50 | 显示全部楼层
单片机玩C++ 发表于 2012-5-15 08:31
一般编译器使用寄存器,会将寄存器分成几个类别,如草稿寄存器,存储寄存器,特殊功能寄存器。
特殊功能寄 ...

咋还加不了兄台为好友,最近正好有个STM32的东西想用下C++实现串口的玩法,扣扣几何哦?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 11:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表