免费注册 查看新帖 |

Chinaunix

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

Solaris(X86版)局部变量入栈顺序的一个小例子 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-25 12:19 |只看该作者 |正序浏览
平台:Solaris(X86版)+gcc
fun1()
{
        int i=1, m=2, n=3;
       ....
}

  这里有三个局部变量i,m,n
   对与gcc编译成机器码后,栈分配顺序一般是从左到右的顺序入栈
    而反汇编的结果中局部变量赋值语句有:

        movl    $1,-4(%ebp)          ; i=1
        movl    $2,-8(%ebp)          ; m=2
        movl    $3,-0xc(%ebp)        ; n=3
   那么,i,m,n的栈中的位置如下图:
        |----------------------------------|------> HIGH
        | EIP (t函数的返回地址)           |
        |----------------------------------|
        | EBP (函数的EBP)                 |
        |----------------------------------|
        | i (EBP-4)                            |
        |----------------------------------|
        | m (EBP-                          |
        |----------------------------------|
        | n (EBP-0xc)                       |
        |----------------------------------|------> LOW

当然实际写或移植编译器时也可不安这个顺序,但为了调试的一致性,可考虑与gcc相近.

[ 本帖最后由 system888net 于 2008-4-25 12:22 编辑 ]

论坛徽章:
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
15 [报告]
发表于 2008-06-09 00:34 |只看该作者
原帖由 chzCPU 于 2008-6-9 00:09 发表



nod,同意


呵呵,这是前天在C/C++版块讨论的结果啊

论坛徽章:
0
14 [报告]
发表于 2008-06-09 00:09 |只看该作者
原帖由 Godbach 于 2008-6-8 23:48 发表


GCC3和GCC4对于声明顺序相同的入栈顺序是不同的,可能编译器会还做其他方面的调整



nod,同意

[ 本帖最后由 chzCPU 于 2008-6-9 00:11 编辑 ]

论坛徽章:
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
13 [报告]
发表于 2008-06-08 23:48 |只看该作者
原帖由 albcamus 于 2008-4-25 13:23 发表
先声明先入栈。 还有反例吗?


GCC3和GCC4对于声明顺序相同的入栈顺序是不同的,可能编译器会还做其他方面的调整

论坛徽章:
0
12 [报告]
发表于 2008-06-08 20:45 |只看该作者
原帖由 system888net 于 2008-4-25 12:19 发表
平台:Solaris(X86版)+gcc
fun1()
{
        int i=1, m=2, n=3;
       ....
}

  这里有三个局部变量i,m,n
   对与gcc编译成机器码后,栈分配顺序一般是从左到右的顺序入栈
    而反汇编的结果中局部 ...



对于栈快照,先声明先入栈和先声明后入栈的效率会有区别吗?

论坛徽章:
0
11 [报告]
发表于 2008-04-26 18:01 |只看该作者
原帖由 zx_wing 于 2008-4-26 13:01 发表

有反例,用gcc4编译


OK,是这样的,不过还要注明平台.

论坛徽章:
0
10 [报告]
发表于 2008-04-26 13:01 |只看该作者
原帖由 albcamus 于 2008-4-25 13:23 发表
先声明先入栈。 还有反例吗?

有反例,用gcc4编译

论坛徽章:
0
9 [报告]
发表于 2008-04-25 18:35 |只看该作者
汗~ LZ 这个也叫例子呀,意义何在?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2008-04-25 13:54 |只看该作者

回复 #7 albcamus 的帖子

C++这个方面应该是强制的(因为牵涉到析构先后的问题),但是C语言这个还真说不准,因为没有一个标准,栈是机器级的基础概念,不是C语言中的概念。刚才又搜了一下standard C99,全文没搜到stack这个词......

论坛徽章:
0
7 [报告]
发表于 2008-04-25 13:23 |只看该作者
先声明先入栈。 还有反例吗?
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP