​ 前段时间把以前的随笔一不小心全都删了,很是痛心,有将近两个月没有动笔。现在到了寒假,深感不能浪费,于是又重拾笔头。内容主要包括读书笔记和补一些原来丢失的文章。

1.编译系统

 以GCC为例,分为四个部分,预处理器,编译器,汇编器,链接器。对于其他的编译过程,基本上也就是这样的流程,只不过有的会划分为三个部分而已。

  • 预处理器:主要处理‘#’标志的头文件,读取例如stdio.h的内容,插入到源文件中,生成扩展名为.i的文件。
    1. #include指令:用于包含文件,包含后代码就可以正确的调用该文件中声明的变量和函数。有两种使用方式:#include <iostream.h>和#include “stdafx.h”。尖括号的将包含系统默认目录的头文件或尖括号内的路径查找。通常是系统中自带的公共头文件。我安装了Mingw,所以用gcc/g++编译时 ,用的是./Mingw/include中的头文件。而双引号包含头文件则在源代码所在目录查找,没有则到默认目录找,通常用于包含程序作者编写的私有头文件。stdafx.h就是微软家自己弄的私有头文件,是非常有用的,不少初学者搞不懂是干嘛的,因此造成了非常多的错误。我会写篇文章再说说它。

    2. #define和#undef:定义宏和取消定义宏。

    3. #if:如果条件为真,则编译下面的代码;

1
2
3
4
5
ifndef:如果宏没有定义则编译;

#endif:结束一个#if...#else条件编译块;

#error:停止编译并显示错误信息。
 具体用法请参看链接:

 [参考链接]:(http://blog.csdn.net/wangxueji45/article/details/41753531)     ​
  • 编译器:将.i的文件编译为汇编代码,扩展名为.s。

  • 汇编器:将.s文件编译为机器语言指令,是二进制的,扩展名为.o。

  • 链接器:负责处理将函数调用等内容链接到文件中。例如:调用了printf函数,而这个函数是标准C库的函数。printf函数存在于printf.o这个单独的预编译好了的文件中。

    我这里只是写了比较可能用到的预处理器方面,其他都略过了,详细点的可以看下面的链接。我打算学习汇编,有可能的话将来会回来补这些东西。

[参考链接]: http://www.ruanyifeng.com/blog/2014/11/compiler.html

2.系统的硬件组成

  • 总线(bus):总线的东西较多,我单开一篇写。
  • I/O设备 :键盘,鼠标,显示器,磁盘。
  • 主存:动态随机存取存储器(DRAM),即常说的内存。
  • 处理器 :CPU是解释或执行存储在主存中的指令的引擎,其核心是一个字长的存储设备(寄存器),称为程序计数器,在任何时候它指向主存中的某条机器语言指令(即含有该指令的地址)。另一个关键是算数逻辑单元(ALU)。注意,这个部分有许多说法,我认为《深入》这本书这里讲的有清楚,我参考王爽的《汇编语言》。