点击查看【bilibili】

本节课重点:在上节课的案例基础上,一步步带你运行一遍程序。

CPU 指令集

CPU 之所以强大,是因为它是可编程的。如果写入不同指令,CPU 就会执行不同任务。CPU 是一块硬件,可以被软件控制。

指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合。而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。

这里假定一个简单的指令集,进行说明。这里假设的 CPU 很基础,所有指令都是 8 位,前四位代表操作码,后四位代表内存地址或寄存器编号。

指令 INSTRUCTION 描述 内存地址或寄存器
LOAD_A 从 RAM 中读取并加载到寄存器 A 4-bit RAM 地址
LOAD_B 从 RAM 中读取并加载到寄存器 B 4-bit RAM 地址
STORE_A 将寄存器 A 的内容保存到 RAM 4-bit RAM 地址
ADD 将两个寄存器的值相加,结果保存到第二个寄存器 2-bit 寄存器 ID,2-bit 寄存器 ID
SUB 将两个寄存器的值相减,结果保存到第二个寄存器 2-bit 寄存器 ID,2-bit 寄存器 ID
JUMP 更新指令地址寄存器中的指令地址,即跳转到新地址 4-bit memory 地址
JUMP_NEG 如果 ALU 的结果是负的,则更新指令地址寄存器中的指令地址(跳转到新地址) 4-bit memory 地址
HALT 程序运行结束,CPU停止运行。 NA

:指令和数据都是存在同一个内存里的,它们在根本层面上毫无区别(都是二进制数)。因此,HALT 指令很重要,能区分指令和数据,让 CPU 停止运行。
image.pngimage.png

上面的例子只有 4 位来存储内存地址,只能操作 16 个地址,显然太少了。
解决方案:真正的现代 CPU 用两种策略

  • 最直接的方法是用更多位来代表指令,比如 32 位或 64 位,即增加 指令长度
  • 第二个策略是 “可变指令长度
    • eg. 若某个 CPU 用 8 位长度的操作码
      • 如果看到 HALT 指令,HALT 不需要额外数据,那么会马上执行
      • 如果看到 JUMP,要跳转的地址存储在 JUMP 的后面(内存中 JUMP 指令地址 + 1的位置),这叫 “立即值“。这样设计,指令可以是任意长度,但会让读取阶段复杂一点点。

典型设备

  • Intel 4004 处理器,1971年
    • 46条指令
    • 用 8 位的”立即值”来执行 JUMP, 以表示更多内存地址
  • 英特尔酷睿 i7
    • 上千条指令和指令变种
    • 指令长度长度从1到15个字节