1. 给 CPU 一些指令来运行
- CPU 强大,是因为可编程
- 写入不同指令,就会执行不同任务
- 是一块硬件,可以被软件控制
2. 举例:00101110
- 假设前 4 位是操作码,后四位指定一个内存地址,或寄存器
- 假设 0010 代表 LOAD_A 指令,然后把后四位 1110(十进制的14) 指定内存地址的值,放入寄存器A。于是,我们把 0010 1110 看成 “LOAD_A 14” 的指令
- 具体举例:“LOAD_A 14”是从地址 14 中拿到数字 3,放入寄存器 A(最好看图,大家可以看原视频,更清晰)
- 两个寄存器里面的数字相加,顺序很重要,因为结果会存在第二个寄存器
- 视频用到的指令:LOAD_A, LOAD_B, STORE_A, ADD, SUB, JUMP, JUMP_NEG HALT
- SUB:减法
- JUMP:跳转:让程序跳转到新位置
- JUMP 0 可以跳回开头
- 底层的实现方式是把指令后 4 位代表的内存地址的值覆盖掉“指令地址寄存器”里的值
- 只有特定条件满足了,才能 JUMP,比如 JUMP NEGATIVE 就是条件跳转的一个例子
- 其他类型的 JUMP
- JUMP IF EQUAL: 如果相等
- JUMP IF GREATER: 如果更大
- JUML_NEGATIVE
- 只在 ALU 的“负数标志”(算数结果为负,“负数标志”才是真)为真时,进行 JUMP,如果是假,就会执行
- HALT
- 计算机需要知道什么时候该停下来,否则 CPU 会不停地跑下去,这叫无限循环(infinite loop)
- 指令和数据:都是存在同一个内存里面的,在根本层面上没有什么区别,都是二进制数,HALT 很重要,能区分指令和数据
3. 软件强大之处
- 让我们做到硬件做不到的事情,例如:ALU 没有除法功能,程序给了我们这个功能,
- 两种策略:
- 出现原因:因为 4 位二进制无法表示数字 17,因此,真正的现代 CPU 用两种策略: ,最直接的方法是用更多位来代表指令,比如 32 位或 64 位,这叫指令长度。
- 策略1: 指令长度(instruction length)
- 策略2: 可变指令长度(variable length instruction):
- 例如:某个 CPU 用 8 位长度的操作码,如果看到 HALT 指令,HALT 不需要额外数据,那么会马上执行
- 如果看到 JUMP,它得知道位置值,这个值在 JUMP 的后面,这叫「立即值」(Immediate Value)
- 这样设计,指令可以是任意长度,但是会让读取阶段复杂一点点
4. 真实的例子
- 1971 年,英特尔发布了 4004 处理器,是第一次把 CPU 做成一个芯片,给后来的英特尔处理器打下了基础
- 它支持 46 个指令,足够做一台能用的电脑,
- 处理器从 1971 年到现在发展巨大,现代 CPU,例如英特尔酷睿 i7,有上千个指令和指令变种,长度从 1 到 15 个字节
- 指令越来越多,是因为给CPU设计了越来越多的功能