地址寄存器所需的位

时间:2018-10-07 08:04:18

标签: assembly cpu-registers machine-code

说我有12个寄存器。在机器代码指令中必须保留多少位才能寻址这12个寄存器中的任何一个?

2 个答案:

答案 0 :(得分:2)

在正常的固定宽度字段中,需要ceil(log2(12))位来编码12种可能性中的1种。

但是,少于2个寄存器的幂是否可以让我们在具有多个寄存器操作数的指令中保存任何位?是的,在这种情况下。

3寄存器指令具有12^3 = 1728个可能的寄存器排列。但是使用3个单独的4位字段将为我们提供2^(4*3) = 4096可能的编码。因此有1个冗余位,因为2^11 = 2048仍大于1728。但是,将所有3个寄存器选择器编码为一个11位字段将需要更复杂的解码。

2寄存器指令需要12^2 = 144唯一的寄存器编码。但是在这里2^(4*2) = 256和次低的2(128)次幂还不够大。

也许最好的选择是使用4位字段,并将13..15寄存器编码用于其他内容。例如转义代码,这意味着它实际上是不同的指令。或者,如果您不需要那么多的指令编码空间,请简化解码器,并保留您的指令格式多余。

或者最好的选择是拥有2的幂的寄存器,这样就不会浪费编码空间。基本上每个现代的寄存器机都有2的幂的寄存器是有原因的。

答案 1 :(得分:1)

寄存器不存储“ 4位基数16个数字” ,这就是您解释此类寄存器的内容的方式(似乎是指16位寄存器,当解释为十六进制整数可以存储值0000..FFFF。

但是寄存器本身是通过位(0或1值)以硬件方式实现的。 16位寄存器具有16位。与数字,十六进制等无关,所有这些都是特定解释的特征,并且解释可以通过使用寄存器中的值的代码或用于查看寄存器内容的工具来完成。

无论如何,“寻址”寄存器与寄存器内容功能没有任何关系!问题是要寻址12个寄存器,因此为简单起见,您可以先给它们命名/地址,例如0,1,2,..,11-必须保留多少位才能对其进行编码?

1位可以存储多少信息? 0或1 = 2个选项。

两个位可以存储这些位模式00、01、10、11 = 4个选项。

三个位可以存储000、001、010、100、011、101、110、111 = 8个选项。 (注意,您会将这些位解释为以二进制编码的整数值,我确实以(无)顺序写了0、1、2、4、3、5、6、7 ...,但是在设计CPU时您几乎不用费心将寄存器选择位解释为整数,更像是“模式匹配”,如果寄存器“ example1”在CPU内部具有模式101,则汇编程序必须将源代码转换为机器代码)

等...

将寄存器的内容显示为十六进制值是很常见的,因为1位数字由4位组成,因此调试代码的程序员可以轻松地“看到”单个位(如果需要),但是可以“看到”十六进制数。仅解释存储在寄存器中的位模式,而不是编码信息的一部分。编码只是位值。