鱼C论坛

 找回密码
 立即注册
查看: 1685|回复: 2

[已解决]关于代码段的问题

[复制链接]
发表于 2017-1-20 16:21:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 超凡天赐 于 2017-1-20 17:36 编辑

通常是指用来存放执行代码的区域怎么理解?是不是存贮的就是代码本身?只读的常数变量是不是右值?我这样理解的比如a=2,这个2就存贮在代码段。这样理解正确吗?
最佳答案
2017-1-20 17:19:06
cat test.c
#include <stdio.h>

int c = 10;

int main(void)
{
        
        int i = 10;

        while(i--)
        {
                c++;
        }

        printf("c = %d\n", c);

        return 0;
}

如果你学过汇编语言,这个问题很好理解
gcc test.c -S
cat test.s
.file        "test.c"
.globl c
        .data
        .align 4
        .type        c, @object
        .size        c, 4
c:
        .long        10
        .section        .rodata
.LC0:
        .string        "c = %d\n"
        .text
.globl main
        .type        main, @function
main:
.LFB0:
        .cfi_startproc
        pushq        %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq        %rsp, %rbp
        .cfi_def_cfa_register 6
        subq        $16, %rsp
        movl        $10, -4(%rbp)
        jmp        .L2
.L3:
        movl        c(%rip), %eax
        addl        $1, %eax
        movl        %eax, c(%rip)
.L2:
        cmpl        $0, -4(%rbp)
        setne        %al
        subl        $1, -4(%rbp)
        testb        %al, %al
        jne        .L3
        movl        c(%rip), %edx
        movl        $.LC0, %eax
        movl        %edx, %esi
        movq        %rax, %rdi
        movl        $0, %eax
        call        printf
        movl        $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size        main, .-main
        .ident        "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-17)"
        .section        .note.GNU-stack,"",@progbits


c变量放到了data段
C语言中的while 、printf、return
这些已经编译成汇编语言,放到了.text 段(代码段)


text段,data段,bss段,堆和栈
http://www.cnblogs.com/hfww/archive/2011/06/04/2223366.html
屏幕快照 2017-01-20 下午4.12.04.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-20 17:19:06 | 显示全部楼层    本楼为最佳答案   
cat test.c
#include <stdio.h>

int c = 10;

int main(void)
{
        
        int i = 10;

        while(i--)
        {
                c++;
        }

        printf("c = %d\n", c);

        return 0;
}

如果你学过汇编语言,这个问题很好理解
gcc test.c -S
cat test.s
.file        "test.c"
.globl c
        .data
        .align 4
        .type        c, @object
        .size        c, 4
c:
        .long        10
        .section        .rodata
.LC0:
        .string        "c = %d\n"
        .text
.globl main
        .type        main, @function
main:
.LFB0:
        .cfi_startproc
        pushq        %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq        %rsp, %rbp
        .cfi_def_cfa_register 6
        subq        $16, %rsp
        movl        $10, -4(%rbp)
        jmp        .L2
.L3:
        movl        c(%rip), %eax
        addl        $1, %eax
        movl        %eax, c(%rip)
.L2:
        cmpl        $0, -4(%rbp)
        setne        %al
        subl        $1, -4(%rbp)
        testb        %al, %al
        jne        .L3
        movl        c(%rip), %edx
        movl        $.LC0, %eax
        movl        %edx, %esi
        movq        %rax, %rdi
        movl        $0, %eax
        call        printf
        movl        $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size        main, .-main
        .ident        "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-17)"
        .section        .note.GNU-stack,"",@progbits


c变量放到了data段
C语言中的while 、printf、return
这些已经编译成汇编语言,放到了.text 段(代码段)


text段,data段,bss段,堆和栈
http://www.cnblogs.com/hfww/archive/2011/06/04/2223366.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-20 17:30:34 | 显示全部楼层
人造人 发表于 2017-1-20 17:19
如果你学过汇编语言,这个问题很好理解
gcc test.c -S
cat test.s

大神,厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 19:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表