📄 一句话概括
Z80 的寄存器一共十几个格子:A 与 F 一对、BC/DE/HL 三组可配对、IX/IY/SP/PC 各司其职,最要紧的是累加器 A 与程序计数器 PC。
📝 本节和前面几节的关系
程序员视角的三样里,寄存器是第一样。这一节把 Z80 的寄存器家底认全,下一节就能追程序了。
一、寄存器全表
A(累加器):算术逻辑运算的主角,加完的结果落回 A;F(标志):记录上一步的零、进位等状态; BC、DE、HL:六只通用寄存器,可两两配对成 16 位用来存地址——HL 最常用来当【地址指针】; IX、IY:变址寄存器,给更灵活的寻址用;SP(栈指针):指向栈顶,函数调用与中断靠它; PC(程序计数器):CPU 的眼睛,指向下一条要取的指令。
二、两个明星寄存器
A 累加器:几乎所有运算都围着它转——这不是巧合,是设计上的省事(少一条数据通路,芯片更简单); PC 程序计数器:程序为什么能一条条往下走?就因为每取完一条指令 PC 自动加上它的长度。 跳转指令(如 JP)做的事,说白了就是把 PC 改成别的值——【控制流】的硬件本质只有一句:改 PC。
三、H 与 L 的小典故
HL 里的 H 是 High、L 是 Low——这两个字母来自 8080 的设计(高字节、低字节)。 这类设计细节不必记,但知道它有来处:计算机硬件里的每个名字,背后都有一段历史(1.6 节【进化】的注脚)。
四、动手 Demo:寄存器职责表
把 Z80 全部寄存器连同位数与职责列成一张表,当作后面的查用卡。
# Z80 寄存器速查
regs = [
("A", 8, "累加器: 运算主角"),
("F", 8, "标志: 零/进位等状态"),
("BC/DE/HL", 16, "通用寄存器(可配对): 存数据或地址"),
("IX/IY", 16, "变址寄存器: 灵活寻址"),
("SP", 16, "栈指针: 栈顶在哪"),
("PC", 16, "程序计数器: 下一条指令在哪"),
]
for n, bits, duty in regs:
print(n.ljust(10), bits, duty)
实跑输出:
--------------------------------------------------------------------
Z80 的寄存器家底
--------------------------------------------------------------------
寄存器是 CPU 内部的小格子,存取最快。Z80 的家底如下:
寄存器 位数 职责
-----------------------------------------------------------------------
A 8 累加器——算术逻辑运算的主角
F 8 标志位——存上一步的结果状态(零/进位等)
B C D E H L 各 8 通用寄存器,可两两配对成 BC/DE/HL 当 16 位用
IX IY 各 16 变址寄存器,给复杂寻址用
SP 16 栈指针——记录【栈】顶在哪
PC 16 程序计数器——下一条指令放在哪
两个明星各有分工:
A(累加器):所有运算围着它转——加完的数落回 A,再送出 A
PC(程序计数器):CPU 的眼睛——它指到哪,CPU 就从哪取指令
PC 自动前进这件事是程序会【一条条往下走】的全部秘密:
取一条指令后 PC += 指令长度 —— 除非遇到跳转指令,否则永不回头。
记住两句话就够用:运算看 A、走路看 PC。其余寄存器边用边查。 PC 是 16 位——和地址总线一样宽,所以它能指向 64K 内存里的任何一格。
30 秒实验
- 在纸上画 PC 的小格子,写上 0x0000,然后模拟取完一条 2 字节指令——PC 应该变成多少?(0x0002)
- 想想为什么栈指针 SP 也要 16 位——栈在内存里,当然要用内存地址。
常见误区
- 以为寄存器就是高速内存——寄存器在 CPU 内部、以名字而非地址访问,比内存快得多。
- 以为 PC 存的是当前指令——它指向【下一条】要取的指令,当前那条已在执行中。
自测三问(点开对答案)
1. 累加器 A 的特殊地位从何而来? —— 设计上让运算围绕它进行,省数据通路、简化芯片——几乎所有算术逻辑都经它。 2. 程序能一条条往下走,靠的是哪个寄存器? —— PC——每取完一条指令自动加上其长度。 3. 什么是【跳转】的硬件本质? —— 把 PC 改成别的值——控制流在硬件层面就是改 PC。- ☐ 下一节(3.4 追踪程序的运行过程)
相关笔记
- 输入测试程序并进行调试 — 上一章亲手装填的那 5 个字节
- 🔵 计算机基础 · 索引 — 寄存器的更多背景与分类在那边
- 💻 计算机是怎样跑起来的 · 索引