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 指令执行示例
以四条指令的简单程序为例:
- LOAD_A 14:将内存地址 14 处的值 3 载入寄存器 A 中。
- LOAD_B 15:将内存地址 15 处的值 14 载入寄存器 B 中。
- ADD B A:用 ALU 将寄存器 B 和寄存器 A 相加,结果存入寄存器 A。
- 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 更复杂的程序:计算两个数相除的余数
通过使用条件跳转指令,可以设计更复杂的程序。例如,计算两个数相除的余数:
- 将内存中的值加载到寄存器。
- 执行减法操作。
- 使用条件跳转指令检查结果是否为负数,以决定跳转或继续执行。
在这个例子中,经过数次循环,程序计算出 11 除以 5 的余数为 1,并正确退出循环。
5. 指令长度与现代 CPU
5.1 指令长度
现代计算机有两种方式解决指令不够用的问题:
-
加大指令长度:
- 最直接的方式是增加指令的位数,比如使用 32 位或 64 位指令。
- 这被称为指令长度。
-
可变指令长度:
- 使用可变长度的指令。
- 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,支持基础指令集,是现代处理器的先驱。