第一章

1.1信息就是位+上下文

#include <stdio.h>

int main()
{
    printf("hello, world\n");
}

其对应的ASCII文本表示如下

  #    i    n    c    l    u    d    e    <sp>    <    s    t    d    i    o    .
//35    105    110    99    108    117    100    101    32        60    115    116    100    105    111    46
  h    > \n    \n    i    n    t <sp>    m    a    i    n    (    )    \n    {
//104    62    10    10    105    110    116    32    109    97    105    110    40    41    10    123
  \n    <sp> <sp> <sp> <sp>    p    r    i    n    t    f    (    "    h    e    l
//10    32     32      32    32    112    114    105    110    116    102    40    34    104    101    108
  l    o    ,    <sp>w    o    r    l    d    \    n    "    )    ;    \n    }
//108    111    44    32    119    111    114    108    100    92    110    34    41    59    10    125

 

1.2程序被其它程序翻译成不同的格式

unix>gcc -o hello hello.c,此时hello.c将经理4个阶段:

  1. hello.c -> 预处理器 -> hello.i  预处理阶段  (.i被修改后的源文件 文本)
  2. hello.i -> 编译器 -> hello.s   编译阶段  (.s汇编文件 文本)
  3. hello.s ->汇编器 -> hello.o   汇编阶段    (.o可重定位目标文件 二进制)
  4. hello.o -> 链接器 -> hello.exe    链接阶段  (可执行目标文件 二进制)

预处理阶段:

预处理器根据以字符#开头的命令,修改原始.c文件,在hello.c中,预处理器将读取stdio.h的内容,并把其直接插入到hello.c的文本中,结果就得到了修改后的源文件,一般以.i为文件扩展名。

 

编译阶段:

编译器将hello.i翻译成hello.s,它包含一个汇编语言文件,该文件的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。

 

汇编阶段:

汇编器将hello.s翻译成机器语言指令,把这些指定打包成为一种叫做可重定位(relocatable)目标程序的格式,并将结果保存到hello.o中。

hello.o是一个二进制文件,它的字节编码是机器语言指令而不是字符。

 

链接阶段:

代码中我们调用了printf(),它是C标准库中的一个函数,每个C编译器都提供。

printf函数存在于一个名为printf.o的单独的预编译目标文件中,而此文件必须以某种方式并入到我们的hello.o中。

链接器就负责处理这种并入,结果就得到hello.exe文件,这是可执行目标文件。

可执行目标文件加载到存储器后,由系统负责执行。

 

posted @ 2022-11-03 11:51  tetrachloroethylene  阅读(34)  评论(0)    收藏  举报