跳转到目录
本来想取“简明计算机入门教程”或“简明计算机与C语言入门教程”的,但是C语言是面向过程的语言,而目前很多数语言(包括大众常用的Python)是面向对象的,以面向过程的思路学习不一定能对学习它们起到帮助。
本文的目标读者有:
- 希望了解计算机底层工作原理的人
- 未学过C语言或计算机知识,同时计算机必修课的内容是C/C++语言的大一学生
- 闲来无事想找些东西看的人
等等
本文会尝试从计算机运行的角度进行讲解,并尝试让初学者看懂。但是本文不保证所有人都能看懂,也不保证看完本文可以拿到很好的成绩。
本文目前以markdown写作,并在cnszlijz.dpdns.org上发布。由于 WordPress 对 Markdown 的支持不好,网页可能无法按预期显示,敬请谅解。后续有可能以 \LaTeX 重新排版,敬请期待。
一、二进制
由于作者太懒了,请各位到网上自学二进制、十六进制、进制转换、八进制(考试外从不出现)的内容,然后再继续往下阅读。
二、计算机的组成
首先,我们知到计算机是以二进制的形式“运行”的。如果你以前不知道,现在你就知道了。
那么,计算机是怎样以二进制的形式运行的呢?很显然,我们点点鼠标、敲敲键盘,这不是二进制;计算机输出图像、声音,这也不是二进制。
要了解这一点,我们需要从最小能“运行”的计算机开始:一块CPU和一个内存。
内存
内存,顾名思义,可以存储东西。在内存中,各种数据、信息是以二进制的形式保存的。
在我们现在使用的内存中,存储数据的元件就是一个个微小的电容。
(我是图片)
发明内存的人定义:电压高于 xxx mV 的电容代表 “1”,电压低于 yyy mV 的电容代表”0″。于是,一个小电容就可以存储一个二进制数字。这就是一个“字”(1 bit)。
把八个字/八个电容存的数字拼起来,就得到了二进制下的“八位数”,即一个“字节”(1 byte)1。
| 3mV |
1012mV |
933mV |
12mV |
1145mV |
1001mV |
69mV |
8mV |
|
| 0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
(01101100)2 = 108 =0x6c |
可以看出,一个字节可以使用一个两位的16进制数来表示。
为了能够方便CPU使用,内存把小电容按8个一组分好,并依次编号,这个编号就是内存地址。每个编号代表一个字节的内存。
| No. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
| data |
0x00 |
0x01 |
0x7f |
0x80 |
0xff |
0x03 |
0x55 |
0xaa |
在后续内容中,我们一律使用这种表格来表示内存。
CPU
CPU 是按照指令,操纵数据进行运算的硬件。
为了优化性能以及实现一些功能,CPU里面也有一些存储数据的元件,叫寄存器(register)。寄存器可以看做是只有几个字节的内存(虽然它们比内存的速度快很多)。每个寄存器都有自己的名字。
那么 CPU 是如何工作的呢?
首先,CPU内置了一套高频震荡电路用来计时,这套电路统称为时钟。按照时钟发出的信号,CPU 每次从内存中取出一条指令,执行它,然后等待下一个时钟信号。2$下一个时钟信号到来时,CPU 再从内存中取出下一条指令,执行它,然后再等待时钟信号。
为了记住现在执行到哪一条指令,CPU 使用一个专用寄存器保存下一条指令的内存地址,并把它命名为 EIP。每次执行完指令,CPU 都会增加 EIP 里的地址,然后再等待下一个时钟信号。
每次 CPU 通电的时候,它都会把 EIP 设置为 0xFFFF0,然后开始不知疲倦地执行指令,直到自己断电。
汇编语言
现在我们要开始设计计算机程序了。但是 CPU 看到的,在内存里的程序指令都是二进制的,正常人看不懂。于是人们发明了汇编语言,把计算机指令逐字逐句地翻译为正常人可以看懂的英文。
| address |
value |
| 0x1 |
mov eax 1 |
| 0x2 |
xor ecx ecx |
| 0x3 |
add ecx 1 |
| 0x4 |
|
| 0x5 |
|
| 0x6 |
|
| 0x7 |
|
未完待续...
附录与注释
为什么不能在表格或超链接里嵌套 LaTeX?回答我!look in my eyes! Tell me, why, baby why? 明明在预览界面显示地好好的,发布文章就变成这个b样?
^ 1. 一个字是 1b,一个字节是 1byte = 1B,所以一个“千字”是 1kb = 1kbit,一个“千字节”是 1kB = 1KB。同理,一个在“兆字节”是 1MB,一个“兆字”是 1Mb。它们之间的换算有两种方法:1k=1024 和 1k=1000; 1M=1024k 和 1M=1000K… 由于人们对换算的意见始终无法统一,计算机厂商们发明了一组新的单位:KiB, MiB, GiB, TiB… 1KiB = 1024Byte, 1MiB = 1024KiB, 1GiB = 1024MiB。现在电脑厂家大多已经改用GiB/TiB,但网络相关的地方还没有改。大家在遇到 kb, KB, MB, GB, Mb/s 时要提高警惕。
^ 2. 有的指令分为几个步骤进行,每个步骤需要等待一个时间信号。甚至有的时候 CPU 会提前执行别的指令。但是不管怎样,CPU 保证结果和依次执行指令一样。所以我们把它看成一次执行完一条指令,然后下次执行下一条。