免费注册 查看新帖 |

Chinaunix

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

弱弱的问个问题。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-08-27 13:12 |只看该作者
有人能说明下for循环的时候栈是如何变化的吗?如果能用汇编描述一下是最好的了。谢谢

论坛徽章:
0
12 [报告]
发表于 2010-08-27 13:16 |只看该作者
我已经可以想象到ebp来回增减的的运行状态了。
davelv 发表于 2010-08-27 12:36



是esp还是ebp?

论坛徽章:
0
13 [报告]
发表于 2010-08-27 13:17 |只看该作者

论坛徽章:
0
14 [报告]
发表于 2010-08-27 13:25 |只看该作者
有人说一个{}之后就会自动释放局部变量。为什么?

论坛徽章:
0
15 [报告]
发表于 2010-08-27 13:40 |只看该作者
因为他的作用域就是在{}内!!!还不懂就找书看去

论坛徽章:
0
16 [报告]
发表于 2010-08-27 13:50 |只看该作者
块变量你们都不知道吗

论坛徽章:
0
17 [报告]
发表于 2010-08-27 16:05 |只看该作者
是esp还是ebp?
towardWang 发表于 2010-08-27 13:16


看了下代码,确认了下,gcc是用esp来操作栈变量的,想当然了,谢谢提醒。

论坛徽章:
0
18 [报告]
发表于 2010-08-27 16:11 |只看该作者
本帖最后由 beyond_touch 于 2010-08-27 16:20 编辑
  1. $ cat test.c
  2. #include <stdio.h>

  3. int main(int argc, char *argv[]) {
  4.         int i;

  5.         for (i = 0; i < 100; i++) {
  6.                 char buffer[1024];
  7.         }

  8.         return 0;
  9. }
  10. $ gcc -S -O0 test.c
  11. $ cat test.s
  12.         .text
  13. .globl _main
  14. _main:
  15. LFB3:
  16.         pushq        %rbp
  17. LCFI0:
  18.         movq        %rsp, %rbp
  19. LCFI1:
  20.         subq        $1072, %rsp
  21. LCFI2:
  22.         movl        %edi, -1060(%rbp)
  23.         movq        %rsi, -1072(%rbp)
  24.         movq        ___stack_chk_guard@GOTPCREL(%rip), %rax
  25.         movq        (%rax), %rdx
  26.         movq        %rdx, -8(%rbp)
  27.         xorl        %edx, %edx
  28.         movl        $0, -1044(%rbp)
  29.         jmp        L2
  30. L3:
  31.         incl        -1044(%rbp)
  32. L2:
  33.         cmpl        $99, -1044(%rbp)
  34.         jle        L3
  35.         movl        $0, %eax
  36.         movq        ___stack_chk_guard@GOTPCREL(%rip), %rdx
  37.         movq        -8(%rbp), %rcx
  38.         xorq        (%rdx), %rcx
  39.         je        L6
  40.         call        ___stack_chk_fail
  41. L6:
  42.         leave
  43.         ret
  44. LFE3:
  45.         .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
  46. EH_frame1:
  47.         .set L$set$0,LECIE1-LSCIE1
  48.         .long L$set$0
  49. LSCIE1:
  50.         .long        0x0
  51.         .byte        0x1
  52.         .ascii "zR\0"
  53.         .byte        0x1
  54.         .byte        0x78
  55.         .byte        0x10
  56.         .byte        0x1
  57.         .byte        0x10
  58.         .byte        0xc
  59.         .byte        0x7
  60.         .byte        0x8
  61.         .byte        0x90
  62.         .byte        0x1
  63.         .align 3
  64. LECIE1:
  65. .globl _main.eh
  66. _main.eh:
  67. LSFDE1:
  68.         .set L$set$1,LEFDE1-LASFDE1
  69.         .long L$set$1
  70. LASFDE1:
  71.         .long        LASFDE1-EH_frame1
  72.         .quad        LFB3-.
  73.         .set L$set$2,LFE3-LFB3
  74.         .quad L$set$2
  75.         .byte        0x0
  76.         .byte        0x4
  77.         .set L$set$3,LCFI0-LFB3
  78.         .long L$set$3
  79.         .byte        0xe
  80.         .byte        0x10
  81.         .byte        0x86
  82.         .byte        0x2
  83.         .byte        0x4
  84.         .set L$set$4,LCFI1-LCFI0
  85.         .long L$set$4
  86.         .byte        0xd
  87.         .byte        0x6
  88.         .align 3
  89. LEFDE1:
  90.         .subsections_via_symbols
复制代码

论坛徽章:
0
19 [报告]
发表于 2010-08-27 16:15 |只看该作者
确实会分票100次1024的

论坛徽章:
0
20 [报告]
发表于 2010-08-27 16:35 |只看该作者
我在gcc 4.4.4下测试发现,gcc默认就把这种行为优化了。它取函数体内最大的块变量,加上函数体内的“全局变量”作为栈空间的长度。
例如如下代码
void test()
{
        int i;
        for(i=0; i>100; i++)
        {
                char  buf[1024];
                //do something
        }
        for(i=0; i>100; i++)
        {
                char buf[2096];
                //dong something;
        }
}
在给函数开辟栈空间的时候,编译器会把最长的块变量,就那个2096个元素的buf变量,加上int i,4个字节的长度,总共为2100字节为栈空间大小,然后用esp寄存器去操作这些变量。
可能不同版本优化不同,但我看楼上帖64位的汇编码也是这样子处理的,不过它多了栈检查的功能,而我x86的汇编码内没有检查栈,其他基本相似。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP