计算机是怎么理解二进制的?
计算机的发明最初纯粹是为了计算数字, 让一个机器能够通过输入不同的数字, 进行加减乘除等. 首先要约定好机器能处理的数是什么样的, 即输入是什么样的, 才能去制造计算机. 二进制只是一种尝试, 十进制也有科学家尝试过, 但由于复杂程度较二进制要高被二进制淘汰了. 比如5个二进制数既是最大到十进制31. 数能表示了, 操作怎么表示呢? 同样, 因为需要进行的操作总是有限的, 比如用一个3位二进制数表示, 那么就相当于计算机最大可以有8种不同操作.
好了, 带着这种思路, 我们来组合一下, 一个16位输入的机器(这里先不讨论16位是怎么来的), 最大支持4种操作, 占了两位二进制. 带两个操作数, 那么操作数就是7位一个, 最大的数就是127. 我们暂时把这个16位二进制数叫做指令. 这样只需要把要指令放在输入端, 等待计算机计算, 再从输出端拿出结果就算完成了一次计算. 而这个指令的物理制作方法, 在最初阶段可能是一些带小孔的木板, 或一张纸, 到现在的硬盘! 这个过程就是存储介质的进化.
计算是能计算了, 可有时候又变的特别麻烦. 假如我们想要加十个数, 依次加起来, 那么按这个方法只能先加前两个数, 把结果取出来, 再与第三个数相加, 依次类推, 考虑到指令再物理上的制作水平不高, 这样的结果就是计算一次, 花相对长的时间制作第二个指令, 再加一次, 这样的机器显然是不能让科学家满意的.
于是大家想能不能让一个操作的结果保存在计算机里面, 下一条指令就变成让那个结果与第二个数据相加, 这样后面的指令就可以不用等前一次的结果出来事先制作好. 后来大家管这个能存储的位置叫做寄存器. 有了寄存器, 后面的指令不一样的只是第二个数据. 但是增加的操作让操作位需要多一些, 16位指令的分配变成了这样.
这时候计算机的利用效率就高了许多, 但是数据的位数(最高只有5位数据了)却不让人满意.
既然有寄存器, 何不多放几个寄存器, 数据全部放在寄存器里, 指令里面原来直接表示数据的位来指示第一跟第二个数据都在哪个寄存器里. 一个16位的寄存器假设有11位表示数据, 计算能力都是质的飞越啊! 问题是怎么表示把数据载入到寄存器里呢? 这时候指令的结构就变成了: 操作, 寄存器选择, 要装载的数据.
有了这个指令, 装载数据跟进行具体操作的指令就已经分开了, 而后者又变成了现在这样.
时间久了, 人们发现者仍然有改进的地方, 于是越来越多种类的操作, 各种各样的指令被发明出来, 后来有人称之为指令集架构(Instruction Set Architecture), 指令集一方面代表着设计计算机处理器的方法, 也代表着能在这种指令集上运行的二进制的规则, 这也就是为什么我们常说在x86上运行的程序想要在ARM上运行都需要重新编译.
等等, 似乎跑题了? 计算机到底是怎么理解一个16位指令哪个部分都代表什么? 操作是怎么进行的? 计算机或者说处理器的结构以及实现是怎么样的?
未完待续