免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4420 | 回复: 7
打印 上一主题 下一主题

如何判断栈的增长方向? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-14 23:49 |只看该作者 |倒序浏览
就是说 栈指针是往高地址还是低地址伸展的

我是这么想的  如果一个函数局部变量每增加一个 地址增大的话 就是往高地址伸展 反之亦然

也就是

func()
{
int a;
int b;
}

stack_direct = (&a<&b)?  GROW_HIGH: GROW_LOW;

      
然而我在一段代码看到 它是这么判断的

statck_direct = testStack(NULL);

testStack(void* p)
{
      n=&p;
      if(n==NULL)
        return testStack(n);
   else{
      if(&n<p)
        return GROW_HIGH;
       return GROW_LOW;
     }
}


用了递归 我看了白天百思不得其解

请各位帮忙


谢谢

论坛徽章:
0
2 [报告]
发表于 2009-05-15 01:46 |只看该作者
LZ的代码是从哪里看来的?
我觉得栈的增长方向是CPU决定的。如果你读一下INTEL 的CPU手册,上面明确说了栈的方向。也规定了POP, PUSH这些汇编指令的具体操作方式。

当然,你也可以不用POP, PUSH这些指令,自己做个栈。那增长方向就随便你了。

论坛徽章:
0
3 [报告]
发表于 2009-05-15 07:47 |只看该作者
我从公司项目代码里看到的
因为代码要在不同cpu上运行  所以要代码判断栈的增长方向

论坛徽章:
0
4 [报告]
发表于 2009-05-15 09:20 |只看该作者
原帖由 wilos 于 2009-5-14 23:49 发表
就是说 栈指针是往高地址还是低地址伸展的

我是这么想的  如果一个函数局部变量每增加一个 地址增大的话 就是往高地址伸展 反之亦然

也就是

func()
{
int a;
int b;
}

stack_direct = (&a

这段代码是有道理的。

  1. func()
  2. {
  3. int a;
  4. int b;
  5. }
复制代码

在不同的编译器下,a,b的在栈上的位置可能不同。例如gcc3.x是按定义的顺序入栈的,但gcc4.x正好相反。你不能用它来判断栈的方向。
但无论如何,函数调用的顺序不会变,所以其参数压栈的先后顺序也不会变,这里用递归比较前后两次函数调用参数的地址。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2009-05-15 10:03 |只看该作者
同意LS的,这个和编译器有有关系的。之前我自己也测试过。

论坛徽章:
0
6 [报告]
发表于 2009-05-18 14:40 |只看该作者
原帖由 zx_wing 于 2009-5-15 09:20 发表

这段代码是有道理的。

func()
{
int a;
int b;
}

在不同的编译器下,a,b的在栈上的位置可能不同。例如gcc3.x是按定义的顺序入栈的,但gcc4.x正好相反。你不能用它来判断栈的方向。
但无论如何,函 ...


我用gcc 4.3编译, 这个用两个局部变量判断stack 方向的代码, 也没问题啊,和gcc 3.4输出一样

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2009-05-18 15:14 |只看该作者
原帖由 albcamus 于 2009-5-18 14:40 发表


我用gcc 4.3编译, 这个用两个局部变量判断stack 方向的代码, 也没问题啊,和gcc 3.4输出一样


是吗。我用GCC4.1和GCC3.4测试,stack的方向是相反的。

[ 本帖最后由 Godbach 于 2009-5-18 15:29 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2009-05-18 15:18 |只看该作者
LZ 可以看一下之前的这篇帖子的讨论:
http://bbs.chinaunix.net/viewthread.php?tid=1151873#pid8537779
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP