计算机CPU中的寄存器

人气:264 发布:2022-10-16 标签: cpu cpu-architecture instruction-set cpu-registers

问题描述

我只是想验证CPU本身是否支持"寄存器"名称。我是说阿格0阿格特2..。ETC在"名字"的末尾。CPU也支持名字吗?!我不是问寄存器本身,我是问CPU是否支持它可以操作的寄存器的名称?

推荐答案

名字是一种神奇的东西,而不是物理上的

这就是重点。名字纯粹是我们人类阅读的。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-添加函数),即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(这是字符串的ASCII值),但为什么要在指令中浪费这么多宝贵的空间?从R20到20(0x14)的映射足够简单和清晰

另见Are registers real? Do they exist in CPU physically?

644