免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4881 | 回复: 13

C 转化为汇编后,一些语句代码的困惑 [复制链接]

论坛徽章:
0
发表于 2008-11-20 21:33 |显示全部楼层
C 代码如下

  1. int
  2. main(void)
  3. {
  4.         int i = 1;
  5.         int j = 2;
  6.         int c;

  7.         c = i + j;

  8.         return 0;
  9. }
复制代码

转化为汇编为:

  1. 1:                .file        "a.c"
  2. 2:                .text
  3. 3:        .globl main
  4. 4:                .type        main, @function
  5. 5:        main:
  6. 6:                leal        4(%esp), %ecx               
  7. 7:                andl        $-16, %esp                        // ???
  8. 8:                pushl        -4(%ecx)
  9. 9:                pushl        %ebp
  10. 10:                movl        %esp, %ebp
  11. 11:                pushl        %ecx
  12. 12:                subl        $16, %esp                        //???
  13. 13:                movl        $1, -16(%ebp)        //i
  14. 14:                movl        $2, -12(%ebp)        //j
  15. 15:                movl        -12(%ebp), %edx
  16. 16:                movl        -16(%ebp), %eax
  17. 17:                addl        %edx, %eax                //i + j
  18. 18:                movl        %eax, -8(%ebp)        //c
  19. 19:                movl        $0, %eax
  20. 20:                addl        $16, %esp
  21. 21:                popl        %ecx
  22. 22:                popl        %ebp
  23. 23:                leal        -4(%ecx), %esp
  24. 24:                ret
  25. 25:                .size        main, .-main
  26. 26:                .ident        "GCC: (GNU) 4.3.0 20080428 (Red Hat 4.3.0-8)"
  27. 27:                .section        .note.GNU-stack,"",@progbits
复制代码

???1>第 6 和 8 行直接为: pushl %esp 不更简单,为何间接的利用 %ecx ? 难道另有用处 ?

???2>第 7 行意思什么 ? 使 %esp 变为上一个 16 的倍数,难道是优化内存访问(有利于对自动变量的访问) ?

???3>第 12 行申请了 4 个自动变量空间,为何多出 所需要内存(3 个 int类型) 一个 ?
    >>>若有 5 个自动变量,结果申请 8 个自动变量空间,难道又是优化内存访问(有利于对自动变量的访问) ?

[ 本帖最后由 爱知 于 2008-11-20 21:38 编辑 ]

论坛徽章:
0
发表于 2008-11-20 21:39 |显示全部楼层
您gcc -O几了?

论坛徽章:
0
发表于 2008-11-20 21:40 |显示全部楼层
>回二楼:
gcc -S a.c

[ 本帖最后由 爱知 于 2008-11-20 21:43 编辑 ]

论坛徽章:
0
发表于 2008-11-20 21:43 |显示全部楼层
这就对了,为啥不O3或者O2看看呢?

论坛徽章:
0
发表于 2008-11-20 21:47 |显示全部楼层
这就对了,为啥不O3或者O2看看呢?

两者一样呀!

论坛徽章:
0
发表于 2008-11-20 21:49 |显示全部楼层
用O了,可能啥都没有了,

论坛徽章:
0
发表于 2008-11-20 21:57 |显示全部楼层
未优化
        .file        "a.c"
        .text
.globl main
        .type        main, @function
main:
.LFB2:
        pushq        %rbp
.LCFI0:
        movq        %rsp, %rbp
.LCFI1:
        movl        $1, -4(%rbp)
        movl        $2, -8(%rbp)
        movl        -8(%rbp), %edx
        movl        -4(%rbp), %eax
        addl        %edx, %eax
        movl        %eax, -12(%rbp)
        movl        $0, %eax
        leave
        ret
.LFE2:
        .size        main, .-main
        .section        .eh_frame,"a",@progbits
.Lframe1:
        .long        .LECIE1-.LSCIE1
.LSCIE1:
        .long        0x0
        .byte        0x1
        .string        "zR"
        .uleb128 0x1
        .sleb128 -8
        .byte        0x10
        .uleb128 0x1
        .byte        0x3
        .byte        0xc
        .uleb128 0x7
        .uleb128 0x8
        .byte        0x90
        .uleb128 0x1
        .align 8
.LECIE1:
.LSFDE1:
        .long        .LEFDE1-.LASFDE1
.LASFDE1:
        .long        .LASFDE1-.Lframe1
        .long        .LFB2
        .long        .LFE2-.LFB2
        .uleb128 0x0
        .byte        0x4
        .long        .LCFI0-.LFB2
        .byte        0xe
        .uleb128 0x10
        .byte        0x86
        .uleb128 0x2
        .byte        0x4
        .long        .LCFI1-.LCFI0
        .byte        0xd
        .uleb128 0x6
        .align 8
.LEFDE1:
        .ident        "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
        .section        .note.GNU-stack,"",@progbits

O2和O3的效果在这个例子上一样
        .file        "a.c"
        .text
        .p2align 4,,15
.globl main
        .type        main, @function
main:
.LFB2:
        xorl        %eax, %eax
        ret
.LFE2:
        .size        main, .-main
        .section        .eh_frame,"a",@progbits
.Lframe1:
        .long        .LECIE1-.LSCIE1
.LSCIE1:
        .long        0x0
        .byte        0x1
        .string        "zR"
        .uleb128 0x1
        .sleb128 -8
        .byte        0x10
        .uleb128 0x1
        .byte        0x3
        .byte        0xc
        .uleb128 0x7
        .uleb128 0x8
        .byte        0x90
        .uleb128 0x1
        .align 8
.LECIE1:
.LSFDE1:
        .long        .LEFDE1-.LASFDE1
.LASFDE1:
        .long        .LASFDE1-.Lframe1
        .long        .LFB2
        .long        .LFE2-.LFB2
        .uleb128 0x0
        .align 8
.LEFDE1:
        .ident        "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
        .section        .note.GNU-stack,"",@progbits

差距还是有20行的,lz自己看吧

论坛徽章:
0
发表于 2008-11-20 22:01 |显示全部楼层
哈哈,果然,用了O之后,啥都没有了,只剩下 xorl  %eax, %eax

论坛徽章:
0
发表于 2008-11-20 22:26 |显示全部楼层
使用 -O 后虽然都没了,但第1,2问题还都存在呀? 第 3 题还是不得其解。

不好意思,七楼代码没看懂

论坛徽章:
0
发表于 2008-11-20 22:43 |显示全部楼层
原帖由 爱知 于 2008-11-20 22:26 发表
使用 -O 后虽然都没了,但第1,2问题还都存在呀? 第 3 题还是不得其解。

不好意思,七楼代码没看懂

1、 你明白 leal 4(%esp), %ecx, .... push -4(%esp) 是什么意思吗?
2、是
3、同上原理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP