在计算机的CPU中注册

时间:2019-02-09 13:20:36

标签: cpu cpu-registers

我只想验证CPU本身是否支持“寄存器”的名称。我的意思是arg0 arg1 arg2 ...等等以“名称”结尾。 CPU支持是否也命名?!我不是在问寄存器本身,而是在问CPU是否支持它可以操纵的寄存器的名称?

1 个答案:

答案 0 :(得分:1)

  

名字神奇地不是物理的

这就是重点。名称仅供我们人类阅读。 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(字符串“ r20”的ASCII值),但是为什么要在指令中浪费那么多宝贵的空间呢?从r20到20(0x14)的映射非常简单清晰