【问题标题】:Registers in the CPU of a computer计算机 CPU 中的寄存器
【发布时间】:2019-07-03 12:49:15
【问题描述】:

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

【问题讨论】:

标签: cpu cpu-architecture cpu-registers instruction-set


【解决方案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 - ADD 函数),即0x01A79020

同样,在 x86 中,寄存器 RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8-R15 are mapped to 0-15 respectivelyxor 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?

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2021-03-25
    • 2014-03-05
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多