打孔卡(Punched Card)【打孔卡,其实就是一种存储程序型计算机。】

现在使用的计算机,只能处理“机器码”,即一连串的0和1。
1、CPU:计算机的大脑,全程Central Processing Unit,中央处理器。
2、不同的CPU能够听懂的语言不一样。
Intel(Windows)、ARM(苹果手机)有各自支持的语言,有两组不同的计算机指令集(Instruction Set)【“Set”:数学上的集合,代表不同的单词、语法】
3、一个计算机的程序,由成千上万条指令组成。平时是存储在存储器中的。
这种程序指令存储在存储器里面的计算机,我们就叫作存储程序型计算机(Stored-program Computer)。
4、非存储程序型的计算机【“插线板计算机”】
Plugboard Computer 的计算设备。我把它直译成“插线板计算机”。
在一个布满了各种插口和插座的板子上,工程师们用不同的电线来连接不同的插口和插座,从而来完成各种计算任务。

// test.c
int main()
{
int a = 1;
int b = 2;
a = a + b;
}
1、编译过程
C语言程序—>汇编语言【ASM,Assembly Language】程序
汇编语言【ASM,Assembly Language】程序—>机器码【Machine Code】(由0和1组成,即一条条的计算机指令。这样一串串的16进制数字,是CPU真正认识的计算机指令。)

从高级语言到汇编代码,再到机器码,就是一个日常开发程序,最终变成了 CPU 可以执行的计算机指令的过程。

1、我们日常用的 Intel CPU,有 2000 条左右的 CPU 指令,常见的指令可以分成五大类:

2、MIPS 指令集

MIPS 的指令是一个 32 位的整数,高 6 位叫操作码(Opcode),也就是代表这条指令具体是一条什么样的指令,剩下的 26 位有三种格式,分别是 R、I 和 J。
R 指令是一般用来做算术和逻辑操作,里面有读取和写入数据的寄存器的地址。如果是逻辑位移操作,后面还有位移操作的位移量,而最后的功能码,则是在前面的操作码不够的时候,扩展操作码表示对应的具体指令的。
I 指令,则通常是用在数据传输、条件分支,以及在运算的时候使用的并非变量还是常数的时候。这个时候,没有了位移量和操作码,也没有了第三个寄存器,而是把这三部分直接合并成了一个地址值或者一个常数。
J 指令就是一个跳转指令,高 6 位之外的 26 位都是一个跳转后的地址。
add $t0,$s2,$s1
我以一个简单的加法算术指令 add t0,s1, $s2, 为例,给你解释。为了方便,我们下面都用十进制来表示对应的代码。
对应的 MIPS 指令里 opcode 是 0,rs 代表第一个寄存器 s1 的地址是 17,rt 代表第二个寄存器 s2 的地址是 18,rd 代表目标的临时寄存器 t0 的地址,是 8。因为不是位移操作,所以位移量是 0。把这些数字拼在一起,就变成了一个 MIPS 的加法指令。
为了读起来方便,我们一般把对应的二进制数,用 16 进制表示出来。在这里,也就是 0X02324020。这个数字也就是这条指令对应的机器码。

回到开头我们说的打孔带。如果我们用打孔代表 1,没有打孔代表 0,用 4 行 8 列代表一条指令来打一个穿孔纸带,那么这条命令大概就长这样:
