CPU 里有一种名为寄存器的存储电路, 相当于机器语言中的变量. 具有代表性的寄存器有以下 8 个. 各个寄存器本来都是有名字的, 但现在知道这些名字的机会已经不多了, 所以在这里顺便介绍下.
AX accumulator, 累加寄存器
CX counter, 计数寄存器
DX data, 数据寄存器
BX base, 基址寄存器
SP stack pointer, 栈指针寄存器
BP base pointer, 基址指针寄存器
SI source index, 源变址寄存器
DI destination index, 目的变址寄存器
这些寄存器全部都是 16 位寄存器, 因此可以存储 16 位的二进制数. 虽然它们都有上面这种正式名称, 但在平常使用的时候, 任命往往用简单的英文字母来代替, 称他们为 "AX寄存器", "SI寄存器" 等.
关于 AX, CX, DX, BX 这几个寄存器名字的由来, 虽然我们找不到缩写为 X 的单词, 但这个 X 表示扩展 (extend) 的意思. 之所以说扩展是因为在这之前 CPU 的寄存器都是 8 位的, 而现在一下子变成了 16 位, 扩展了一倍.
这 8 个寄存器全部合起来也只有 16 个字节, 换句话说, 就算我们把这 8 个寄存器都用上, CPU 也只能存储 16 个字节.
另一方面, CPU 中还有 8 个 8 位寄存器.
AL accumulator low, 累加寄存器低位
CL counter low, 计数寄存器低位
DL data low, 数据寄存器低位
BL base low, 基址寄存器低位
AH accumulator high, 累加寄存器高位
CH counter high, 计数寄存器高位
DH data high, 数据寄存器高位
BH base high, 基址寄存器高位
名字看起来有点像, 其实这是有原因的: AX 寄存器共有 16 位, 其中 0 位到 7 位的低 8 位称为 AL, 而 8 位到 15 位的高 8 位称为 AH. 所以, 如果以为 "再加上这 8 个 8 位寄存器, CPU 就又可以多保存 8 个字节了" 就大错特错了, CPU 还是那个 CPU, 依然只能存储区区 16 个字节. CPU 的存储能力实在太有限了.
而 BP, SP, SI, DI 这几个寄存器不能为为 "L" 和 "H". 如果无论如何都要分别取高位或低位数据的话, 就必须先将值赋到 AX 中去, 然后用 AL, AH 来取值.
32 位寄存器为:
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
这些就是 32 位寄存器. 在 16 位寄存器的名字前面加上一个 E 就是 32 位寄存器的名字了. 这个字母 E 其实还是来源于 "extend" 这个词. 在当时主流为 16 位的时代里, 能扩展到 32 位算是个飞跃了. 虽说 EAX 是个 32 位寄存器, 但其实跟前面一样, 它有一部分是与 AX 共用的, 32 位中的低 16 位就是 AX, 而高 16 位既没有名字, 也没有寄存器编号, 也就是说, 虽然可以把 EAX 作为 2 个 16 位寄存器来用, 但只有低 16 位用起来方便, 如果我们要用高 16 位的话, 就需要使用位移命令, 把高 16 位移到低 16 位后才能用.
这么说来, 就是 32 位的 CPU 也只能存储区区 32 字节, 存储能力还真是小的可怜.
还有段寄存器 (segment register), 这些段寄存器都是 16 位寄存器:
ES extra segment, 附加段寄存器
CS code segment, 代码段寄存器
SS stack segment, 栈段寄存器
DS data segment, 数据段寄存器
FS segment part 2, 没有名字
GS segment part 3, 没有名字
以上摘自《 30 天自制操作系统》, 作者 [日] 川合秀实.