08 指令和程序(Instructions & Programs)

104 阅读4分钟

8. 指令和程序-Instructions & Programs_哔哩哔哩_bilibili

1. 简介

在第 08 集中,视频主要介绍了中央处理单元(CPU)的编程原理,包括指令的执行方式、CPU 强大的关键原因,即它的可编程性,并通过设定的例子详细解释了几个重要指令的工作方式和程序流程。

2. CPU 的基本结构与指令

2.1 组成与功能

上集中我们已经结合了算术逻辑单元(ALU)、控制单元、内存和时钟,构建了一个基本但功能齐全的中央处理单元(CPU),这也是计算机的核心部分。CPU 的强大之处在于它的可编程性,通过编写不同的指令序列,CPU 可以执行不同的任务,它允许硬件由容易修改的软件来控制。

2.2 内存与指令

CPU 内存中的每个地址包含 8 位数据,其中前 4 位是操作码(opcode),后 4 位指定内存地址或寄存器。例如,内存地址 0 处存储的值是 00101110,其操作码 0010 表示 LOAD_A 指令,该指令会将内存地址 14 处的值读取到寄存器 A 中。

2.3 指令执行示例

以四条指令的简单程序为例:

  1. ​LOAD_A 14​:将内存地址 14 处的值 3 载入寄存器 A 中。
  2. ​LOAD_B 15​:将内存地址 15 处的值 14 载入寄存器 B 中。
  3. ​ADD B A​:用 ALU 将寄存器 B 和寄存器 A 相加,结果存入寄存器 A。
  4. ​STORE_A 13​:将寄存器 A 中的值存入内存地址 13。

3. 增加指令集的复杂性

为了实现更多操作,CPU 可以支持更多指令。例如:

  • SUB 指令:类似 ADD,但执行减法操作。
  • JUMP 指令:指示 CPU 跳转到新的指令位置,改变指令执行顺序或跳过一些指令。
  • JUMP_NEGATIVE 指令:条件跳转,只有在 ALU 算术操作结果为负数时才执行。
  • HALT 指令:程序结束,停止计算机。

增加后的指令如下:

增加后的指令

4. 条件跳转和更复杂的程序

4.1 条件跳转:跳出无限循环

在一个示例程序中,两个初始值(均为 1)通过 ADD 指令不断相加并存入寄存器 A,再通过 JUMP 指令跳回,造成无限循环。为避免这种情况,可以使用条件跳转指令(如 JUMP_NEGATIVE、JUMP_IF_EQUAL 等指令),使程序在满足某个条件时跳出循环。

4.2 更复杂的程序:计算两个数相除的余数

通过使用条件跳转指令,可以设计更复杂的程序。例如,计算两个数相除的余数:

  1. 将内存中的值加载到寄存器。
  2. 执行减法操作。
  3. 使用条件跳转指令检查结果是否为负数,以决定跳转或继续执行。

在这个例子中,经过数次循环,程序计算出 11 除以 5 的余数为 1,并正确退出循环。

CPU 芯片

5. 指令长度与现代 CPU

5.1 指令长度

现代计算机有两种方式解决指令不够用的问题:

  1. 加大指令长度:

    • 最直接的方式是增加指令的位数,比如使用 32 位或 64 位指令。
    • 这被称为指令长度。
  2. 可变指令长度:

    • 使用可变长度的指令。
    • CPU 看到无需额外值的指令(如 HALT)时,可以立即执行。
    • 如果遇到像 JUMP 这样的指令,CPU 知道需要额外获取跳转地址,这个值紧跟在 JUMP 指令后面。
    • 这称为立即值(Immediate Value)。
    • 在这种设计中,指令长度可以是任意多个字节,使 CPU 的取指阶段更复杂。

以上这两种策略目前普遍应用于现代处理器中,以实现更复杂和高效的运算。

5.2 现代 CPU

Intel 4004 是第一个将 CPU 集成到单个芯片上的处理器,支持 46 条指令,包括 JUMP、ADD、SUBTRACT 和 LOAD 指令。现代处理器如 Intel Core i7 具有数千条指令和指令变种,长度从 1 到 15 个字节不等。

6. 总结

  • CPU 可编程性使其具有强大功能。
  • 指令分为操作码和内存地址或寄存器。
  • 条件跳转指令可以打破无限循环。
  • 现代 CPU 通过增加指令长度和指令集复杂性,支持更多功能。
  • Intel 4004 是第一个集成在芯片上的 CPU,支持基础指令集,是现代处理器的先驱。