名字是一种神奇而不是物理的东西
这就是重点。名称仅供我们人类阅读。 CPU 绝对没有名称的概念。 它们处理的唯一内容是数字。字符是数字,地址是数字,指令是数字......寄存器也是在指令本身中以某种方式编码的数字
组装后,指令流中只有数字。即使是跳转标签、函数……也不存在于可执行二进制文件中。它们被相对描述为“此之后的第 14 条指令”、“前 48 个字节的指令”...或绝对描述为 “地址 0xFACECAFE 处的函数"。名称(如果有)放在单独的部分中以描述地址表示的内容,否则没有人知道变量 0x65DAB3CF 或 0xFACECAFE 处的函数是什么。这些名称用于调试器打印变量以供人们阅读,或用于链接器、加载器......以找到替换地址的正确位置。 CPU 完全忽略它们
例如在MIPS $ra is the register number 31, $t9 is 25, $a3 is 7... 中,它们将在指令中被编码为它们的二进制值。 ADD $s2, $t5, $a3 将被编码为
000000(R 型指令操作码) - 01101 ($13/$t5) - 00111 ($7/$a3 ) - 10010 ($18/$s2) - 00000 (班次金额) - 100000 (32 - ADD 函数),即0x01A79020
同样,在 x86 中,寄存器 RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8-R15 are mapped to 0-15 respectively。 xor ecx, esi 编码为31 f1 = 00110001 11110001,最后 6 位存储 2 个参数。更复杂的指令需要更复杂的规则,例如ADD r9, [rax + 4*r13 + 20]被编码为4e 03 4c a8 14
由于 CPU 只关心 数字,因此实际上可以构造一种编码,将 寄存器名称的字符串映射到 寄存器本身. 例如,r20 在指令中会被编码为72 32 30(字符串“r20”的ASCII 值),但是为什么要在指令中浪费这么多宝贵的空间呢?一张r20到20(0x14)的map就够简单清晰了
另见Are registers real? Do they exist in CPU physically?