鱼C论坛

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

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

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

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

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

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

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

  3. int c = 10;

  4. int main(void)
  5. {
  6.        
  7.         int i = 10;

  8.         while(i--)
  9.         {
  10.                 c++;
  11.         }

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

  13.         return 0;
  14. }
复制代码


如果你学过汇编语言,这个问题很好理解
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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  3. int c = 10;

  4. int main(void)
  5. {
  6.        
  7.         int i = 10;

  8.         while(i--)
  9.         {
  10.                 c++;
  11.         }

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

  13.         return 0;
  14. }
复制代码


如果你学过汇编语言,这个问题很好理解
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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大神,厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-10 13:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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