Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371586
  • 博文数量: 159
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-02 10:42
文章分类

全部博文(159)

文章存档

2015年(18)

2014年(132)

2013年(9)

分类: LINUX

2014-05-28 17:42:35

在很多人的眼里,C语言和linux常常是分不开的。这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当 然,linux操作系统本身对C语言的支持也是相当到位的。作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他 对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位。作为程序员来说,linux系统为我们提供了很多理想的环境,这其中包括了下面几个方面,
    (1)完善的编译环境,包括gcc、as、ld等编译、链接工具
    (2)强大的调试环境,主要是gdb工具
    (3)丰富的自动编译工具,主要是make工具
    (4)多样化的os选择,ubuntu、redflag等等
    (5)浩瀚的开源代码库
当然,不管我怎么说,最终朋友们还是应该自己勇敢地跨出前进的第一步。如果还没有过Linux编程经验的朋友可以首先在自己的pc上面安装一个虚拟机,然后就可以在shell下面编写自己的C语言代码了。

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     printf("Hello World!\n");
  5.     return 0;
  6. }
编写完上面的代码后,你需要做的就是两个步骤:1、输入 gcc hello.c -o hello;2、输入./hello。如果一切正常的话,此时你应该会在屏幕上看到一行hello的打印。如果你看到了,那么恭喜你,你已经可以开始linux的c语言编程之旅了。
    当然,我们不会满足于这么简单的打印功能。下面就可以编写一个简单的迭代函数,

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int iterate(int value)
  3. {
  4.     if(1 == value)
  5.         return 1;
  6.     return iterate(value - 1) + value;
  7. }

  8. int main()
  9. {
  10.     printf("%d\n", iterate(10));
  11.     return 0;
  12. }
此时,同样我们需要重复上面的步骤:1、输入gcc hello.c -o hello;2、输入./hello。当然此时如果一切OK的话,你就会看到屏幕会有55这个数的输出。本来1到10的数据之和就是55, 这说明我们的程序是正确的。

    当然, 还会有一些朋友对程序的反汇编感兴趣,那么他需要两个步骤:1、gcc hello.c -g -o hello;2、objdump -S -d ./hello。之所以在gcc编译的时候加上-g是为了添加调试信息,objdump中的-S选项是为了在显示汇编代码的时候同时显示原来的C语言源代 码。


点击(此处)折叠或打开

  1. 080483c4 <iterate>:
  2.     #include <stdio.h>
  3.       
  4.     int iterate(int value)
  5.     {
  6.  80483c4:    55             push %ebp
  7.  80483c5:    89 e5          mov %esp,%ebp
  8.  80483c7:    83 ec 18       sub $0x18,%esp
  9.         if(1 == value)
  10.  80483ca:    83 7d 08 01    cmpl $0x1,0x8(%ebp)
  11.  80483ce:    75 07          jne 80483d7 <iterate+0x13>
  12.             return 1;
  13.  80483d0:    b8 01 00 00 00 mov $0x1,%eax
  14.  80483d5:    eb 11          jmp 80483e8 <iterate+0x24>
  15.         return iterate(value - 1) + value;
  16.  80483d7:    8b 45 08       mov 0x8(%ebp),%eax
  17.  80483da:    83 e8 01       sub $0x1,%eax
  18.  80483dd:    89 04 24       mov %eax,(%esp)
  19.  80483e0:    e8 df ff ff ff call 80483c4 <iterate>
  20.  80483e5:    03 45 08       add 0x8(%ebp),%eax
  21.     }
  22.  80483e8:    c9             leave
  23.  80483e9:    c3             ret

  24. 080483ea <main>:
  25.       
  26.     int main()
  27.     {
  28.  80483ea:    55                       push %ebp
  29.  80483eb:    89 e5                    mov %esp,%ebp
  30.  80483ed:    83 e4 f0                 and $0xfffffff0,%esp
  31.  80483f0:    83 ec 10                 sub $0x10,%esp
  32.         printf("%d\n", iterate(10));
  33.  80483f3:    c7 04 24 0a 00 00 00     movl $0xa,(%esp)
  34.  80483fa:    e8 c5 ff ff ff           call 80483c4 <iterate>
  35.  80483ff:    ba e4 84 04 08           mov $0x80484e4,%edx
  36.  8048404:    89 44 24 04              mov %eax,0x4(%esp)
  37.  8048408:    89 14 24                 mov %edx,(%esp)
  38.  804840b:    e8 e4 fe ff ff           call 80482f4 <printf@plt>
  39.         return 0;
  40.  8048410:    b8 01 00 00 00           mov $0x0,%eax
  41.     }




阅读(585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~