免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: md231
打印 上一主题 下一主题

[C] 局部变量在栈中的存放顺序 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-09-23 23:32 |只看该作者
x86 栈向下增长

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
12 [报告]
发表于 2013-09-23 23:39 |只看该作者
回复 10# md231
你这是env,argv,argc的顺序?
你用的是x86机器吗?
你用的是c语言的默认调用约定吗?


   

论坛徽章:
0
13 [报告]
发表于 2013-09-24 01:02 |只看该作者
回复 12# 井蛙夏虫

是env, argv, argc的顺序.
机器是macbook pro, x86_64平台


   

论坛徽章:
0
14 [报告]
发表于 2013-09-24 01:03 |只看该作者
回复 12# 井蛙夏虫


    我是直接用gcc编译的, 有的是default的过程调用规则.

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
15 [报告]
发表于 2013-09-24 02:29 |只看该作者
回复 14# md231
我的系统gcc编译结果和你的相反,clang编译和你的相同。

用objdump反汇编后发现
gcc反汇编结果:
  1. 080483c4 <main>:
  2. 80483c4:   55                      push   %ebp
  3. 80483c5:   89 e5                   mov    %esp,%ebp
  4. 80483c7:   83 e4 f0                and    $0xfffffff0,%esp
  5. 80483ca:   83 ec 10                sub    $0x10,%esp
  6. 80483cd:   b8 d4 84 04 08          mov    $0x80484d4,%eax
  7. 80483d2:   8d 55 08                lea    0x8(%ebp),%edx
  8. 80483d5:   89 54 24 0c             mov    %edx,0xc(%esp)
  9. 80483d9:   8d 55 0c                lea    0xc(%ebp),%edx
  10. 80483dc:   89 54 24 08             mov    %edx,0x8(%esp)
  11. 80483e0:   8d 55 10                lea    0x10(%ebp),%edx
  12. 80483e3:   89 54 24 04             mov    %edx,0x4(%esp)
  13. 80483e7:   89 04 24                mov    %eax,(%esp)
  14. 80483ea:   e8 f1 fe ff ff          call   80482e0 <printf@plt>
  15. 80483ef:   b8 00 00 00 00          mov    $0x0,%eax
  16. 80483f4:   c9                      leave  
  17. 80483f5:   c3                      ret   
复制代码
这个比较简单,就是取各个参数的地址。
clang反汇编结果:
  1. 080483b0 <main>:
  2. 80483b0:   55                      push   %ebp
  3. 80483b1:   89 e5                   mov    %esp,%ebp
  4. 80483b3:   56                      push   %esi
  5. 80483b4:   83 ec 34                sub    $0x34,%esp
  6. 80483b7:   8b 45 10                mov    0x10(%ebp),%eax
  7. 80483ba:   8b 4d 0c                mov    0xc(%ebp),%ecx
  8. 80483bd:   8b 55 08                mov    0x8(%ebp),%edx
  9. 80483c0:   89 45 e8                mov    %eax,-0x18(%ebp)
  10. 80483c3:   b8 00 00 00 00          mov    $0x0,%eax
  11. 80483c8:   c7 45 f8 00 00 00 00    movl   $0x0,-0x8(%ebp)
  12. 80483cf:   89 55 f4                mov    %edx,-0xc(%ebp)
  13. 80483d2:   89 4d f0                mov    %ecx,-0x10(%ebp)
  14. 80483d5:   8b 4d e8                mov    -0x18(%ebp),%ecx
  15. 80483d8:   89 4d ec                mov    %ecx,-0x14(%ebp)
  16. 80483db:   8d 55 f4                lea    -0xc(%ebp),%edx
  17. 80483de:   89 e6                   mov    %esp,%esi
  18. 80483e0:   89 56 0c                mov    %edx,0xc(%esi)
  19. 80483e3:   8d 55 f0                lea    -0x10(%ebp),%edx
  20. 80483e6:   89 56 08                mov    %edx,0x8(%esi)
  21. 80483e9:   8d 55 ec                lea    -0x14(%ebp),%edx
  22. 80483ec:   89 56 04                mov    %edx,0x4(%esi)
  23. 80483ef:   c7 06 e4 84 04 08       movl   $0x80484e4,(%esi)
  24. 80483f5:   89 45 e4                mov    %eax,-0x1c(%ebp)
  25. 80483f8:   e8 c3 fe ff ff          call   80482c0 <printf@plt>
  26. 80483fd:   89 45 e0                mov    %eax,-0x20(%ebp)
  27. 8048400:   8b 45 e4                mov    -0x1c(%ebp),%eax
  28. 8048403:   83 c4 34                add    $0x34,%esp
  29. 8048406:   5e                      pop    %esi
  30. 8048407:   5d                      pop    %ebp
  31. 8048408:   c3                      ret   
复制代码
这个处理麻烦一些,可见它将参数先拷贝到自身的堆栈空间,然后取地址。所以clang取地址时已经不是原来参数的地址了。


   

论坛徽章:
0
16 [报告]
发表于 2013-09-24 03:48 |只看该作者
回复 15# 井蛙夏虫

请问你的gcc版本是什么, 和这个有关系么?
我没有用过clang

我的gcc是gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

   

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
17 [报告]
发表于 2013-09-24 10:20 |只看该作者
回复 16# md231
有没有关系不清楚,因为没测试过。
我的gcc版本gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
你用objdump -d yourfile反汇编,然后把main的汇编代码贴上来看看(如果你会汇编就自己分析一下吧)


   

论坛徽章:
0
18 [报告]
发表于 2013-09-24 11:22 |只看该作者
这玩意跟机器环境有关,不同环境结果大多都不一样!原因不详!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP