“C语言”读书札记之[编译执行]

介绍

成都创新互联公司是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:成都网站建设、网站制作、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。

现在C语言跨的领域非常之多,如游戏、嵌入式、智能电器等。为什么不直接用汇编或机器语言直接写呢?原因是汇编和机器语言受到计算机体系结构的影响。直接用某种体系结构的汇编或机器指令写出来的程序只能在这种体系结构的计算机上运行。

C语言的好处是各种体系结构的计算机都有各自的C编译器,可以把C程序编译成各种不同体系结构的机器指令,这意味着用C语言写的程序只需稍加修改甚至不用修改就可以在各种不同的计算机上编译运行。

hello,world

我们从简单hello,world开始——有人说了,又来了,这个“hello,world”,好多博友都写这种东西烦不烦?呵呵,那我写的也许跟他们说的不一样呢?或者理解的跟别人有不一样的地方。

先写个程序我们看看。

源程序(或者源文件):是程序员通过文本编辑器创建并保存的文本文件。源程序实际就是由0和1组成的位序列,这些位8个一组,成为字节,每个字节通过ASCII字符集(大部分是)对应一个文本字符。

下面是上面程序对应的16进制数字表示

在终端输入man ascii看看ascii表

#p#

操作步骤:

查看16进制格式

回复到文本格式

我们看看对应的二进制是什么样的?——这个也是在磁盘中的存储状态。

总结:

系统中所有的信息——包括磁盘文件、存储器中的程序,存储器中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。

思考:

同样的一套字节序列可能在不同的上下文中表示一个整数、浮点数、字符串或者机器指令。——这取决于数据对象的上下文。

我们该做什么?

做为程序员,我们需要了解数字的机器表示方式,因为它们与常见的整数和实数是不同的。

使用参考:在Linux下使用vim配合xxd查看并编辑二进制文件

#p#

翻译

源程序是能够被人读懂的,为了能在系统上运行,我们需要把C语句通过其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为“可执行目标程序“的格式打包好,并以二进制磁盘文件的形式存放起来。

在Linux系统上,从源文件到目标文件(可执行目标程序文件)的转化是由编译器驱动程序完成的。如下图:

我们用GCC工具观察每个阶段。(GCC:GNU Compiler Collection,GNU编译器套装)

先赠送一张gcc命令选项图

预处理阶段

查看main.i的部分源码

总结:预处理器(cpp)根据以字符#开头的命令,修改原始C程序,结果得到了另一个C程序(还是C程序),通常以i做为文件扩展名。

编译阶段

查看main.s的源码

总结:将C语言文本文件翻译成汇编语言文本文件。——汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出语言。

汇编阶段

打开源代码,注意此时为二进制磁盘文件,还有注意操作步骤

此时为乱码,需要进行:%!xxd操作

查看指令

总结:汇编器(as)将main.s翻译成机器语言指令,把这些指令打包成为一种“可重定位目标程序“的格式,并将结果保存到main.o文件中,main.o是二进制文件,它的字节编码是机器语言指令而不是字符(所以用文本编译器看会出现乱码)。

链接阶段

按照汇编阶段操作,查看部分指令码

总结:程序中调用了printf函数,它是C标准库的一个函数,printf函数存在于一个名为printf.o的单独的预编译目标文件中。连接器(ld)负责把printf.o的预编译目标文件进行并入,结果就得到a.out文件。

NOTE:a.out是可执行的目标文件,而main.o是可重定位目标程序文件。——可执行目标文件加载到系统存储器后,由系统负责执行。而可重定位目标程序文件是提供给链接器使用,执行并入操作。

总结

这一篇主要是学习gcc编译器的编译过程,对整个过程有所熟悉。如果有好的知识点,望大家赐教。

#p#

vim配置分享

 
 
 
 
  1. " An example for a vimrc file.
  2. "
  3. " Maintainer:   Bram Moolenaar 
  4. " Last change:  2006 Nov 16
  5. "
  6. " To use it, copy it to
  7. "     for Unix and OS/2:  ~/.vimrc
  8. "         for Amiga:  s:.vimrc
  9. "  for MS-DOS and Win32:  $VIM\_vimrc
  10. "       for OpenVMS:  sys$login:.vimrc
  11. " When started as "evim", evim.vim will already have done these settings.
  12. if v:progname =~? "evim"
  13.   finish
  14. endif
  15. " Use Vim settings, rather then Vi settings (much better!).
  16. " This must be first, because it changes other options as a side effect.
  17. set nocompatible
  18. " allow backspacing over everything in insert mode
  19. set backspace=indent,eol,start
  20. if has("vms")
  21.   set nobackup      " do not keep a backup file, use versions instead
  22. else
  23.   set nobackup      " keep [NO] backup file
  24. endif
  25. set history=250     " keep 250 lines of command line history
  26. set ruler       " show the cursor position all the time
  27. set showcmd     " display incomplete commands
  28. set incsearch      " do incremental searching
  29. set nu
  30. " For Win32 GUI: remove 't' flag from 'guioptions': no tearoff menu entries
  31. " let &guioptions = substitute(&guioptions, "t", "", "g")
  32. " Don't use Ex mode, use Q for formatting
  33. map Q gq
  34. " In many terminal emulators the mouse works just fine, thus enable it.
  35. set mouse=a
  36. " Switch syntax highlighting on, when the terminal has colors
  37. " Also switch on highlighting the last used search pattern.
  38. if &t_Co > 2 || has("gui_running")
  39.   syntax on
  40.   set hlsearch
  41. endif
  42. " Only do this part when compiled with support for autocommands.
  43. if has("autocmd")
  44.   " Enable file type detection.
  45.   " Use the default filetype settings, so that mail gets 'tw' set to 72,
  46.   " 'cindent' is on in C files, etc.
  47.   " Also load indent files, to automatically do language-dependent indenting.
  48.   filetype plugin indent on
  49.   " Put these in an autocmd group, so that we can delete them easily.
  50.   augroup vimrcEx
  51.   au!
  52.   " For all text files set 'textwidth' to 78 characters.
  53.   autocmd FileType text setlocal textwidth=78
  54.   " When editing a file, always jump to the last known cursor position.
  55.   " Don't do it when the position is invalid or when inside an event handler
  56.   " (happens when dropping a file on gvim).
  57.   autocmd BufReadPost *
  58.     \ if line("'\"") > 0 && line("'\"") <= line("$") |
  59.     \   exe "normal! g`\"" |
  60.     \ endif
  61.   autocmd VimLeave *
  62.     \ if has("mksession") && exists("v:this_session") && v:this_session != "" |
  63.     \   exec "mksession!" v:this_session |
  64.     \ endif
  65.   augroup END
  66. else
  67.   set autoindent        " always set autoindenting on
  68. endif " has("autocmd")
  69. " Convenient command to see the difference between the current buffer and the
  70. " file it was loaded from, thus the changes you made.
  71. command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
  72.         \ | wincmd p | diffthis
  73. " Add by Journeylee to make things more easily
  74. set softtabstop=4
  75. set shiftwidth=4
  76. set tabstop=4
  77. set noexpandtab
  78. set smarttab
  79. set showmatch
  80. set foldenable
  81. set autoindent
  82. set smartindent
  83. set cindent
  84. set foldmethod=marker
  85. set background=dark
  86. set nobackup
  87. set encoding=utf-8
  88. language en_US.utf8
  89. set fileencodings=ucs-bom,utf-8,gbk,latin1
  90. set fileformats=unix,dos,mac
  91. set fileencoding=utf-8
  92. set fileformat=unix
  93. set fileformat=unix
  94. set matchtime=15
  95. " Make shift-insert work like in Xterm
  96. map  
  97. map!  
  98. " let xterm16_brightness = 'default'     " Change if needed
  99. " let xterm16_colormap = 'allblue'       " Change if needed
  100. " colo xterm16 
  101. "不使用swap文件
  102. map  :!php -l %
  103. "set runtimepath+=/home/zhoubc/opt/vim/doc
  104. "autocmd BufNewFile,Bufread *.ros,*.inc,*.php set keywordprg="help"
  105. let g:winManagerWindowLayout='TagList|FileExplorer'
  106. let g:winManagerWidth=30
  107. nmap  wm :WMToggle

分享名称:“C语言”读书札记之[编译执行]
分享网址:http://www.36103.cn/qtweb/news2/27802.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联