本文介绍了计算机CPU中的寄存器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我只是想验证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
将编码为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?
这篇关于计算机CPU中的寄存器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!