【问题标题】:How is register size and instruction encoding / operands related?寄存器大小和指令编码/操作数有什么关系?
【发布时间】:2013-09-23 19:02:33
【问题描述】:

示例:CPU 有 x 个寄存器,指令编码的 y 位用于引用寄存器操作数。一条指令可以指定多少个寄存器操作数?架构未知。

有没有通用的解决方案?

【问题讨论】:

    标签: cpu cpu-architecture


    【解决方案1】:

    这个问题已经很笼统了——你需要对你希望指令处理的寄存器进行编码(以 x86 为例,mov eax, ebx 需要该架构中可用的总寄存器中的 2 个,inc ecx 需要一个)。

    您有 x 个寄存器,因此您需要 log2(x) 位来对每个寄存器进行编码。由于您只允许使用 y 位,并且您最多可以在一条指令中对 floor(y/log2(x)) 寄存器进行编码。

    (好吧,如果你有多余的位,你仍然可以使用它们来对某些东西进行部分编码,但这可能不是问题所要测试的......)

    【讨论】:

    • 因此,如果总寄存器数例如为 8:log2(8) = 每个寄存器的 3 位。 y 位是 8,所以最大值是: floor(8/log2(8)) = 2 你怎么知道要使用二进制对数和下限?谢谢
    • 由于位是二进制的,n 位可以编码 2^n 个项目,因此倒数是 log2。地板是因为如果你有额外的 2 位,你不能编码第三个寄存器。但是,您可以使用它们对其他内容进行编码(例如内存寻址模式或缩放等)。但这些东西是特定于架构的,问题很笼统。
    • 以正确的方式解决这种类型的计算(非特定于体系结构)对寄存器数量执行 log2 以获得每个寄存器的大小,这是 2^n 的倒数例如,在 8 个寄存器的情况下:2^8 = 256,并且 log2(256) = 8 使用 floor(寄存器数 / log2(指令编码位)来获得单个指令中的寄存器操作数的最大值。如果 floor被带走 8/log2(8) = 8/3 (或 2.666...) 很难理解“额外的 2 位”谢谢
    • 忽略剩下的位。让我们决定在上述问题的范围内我们不能对它们做任何有用的事情。
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多