指令解码器处理微控制器中寄存器常量的常见方式是什么?

What are the common ways instruction decoders deal with using constants over registers in microcontrollers?

具体来说,如果汇编指令有一个常量作为操作数之一,指令解码器如何将它传递给 ALU?目前我想到了三种方法。

到目前为止,我看到了上述所有三种方法的缺点。

微控制器中的真实 CPU 是否使用这些方法中的任何一种?或者还有其他解决方案吗?如果是,它们是什么?

Pass the constant in the same bus as the address would go and separately trigger some enable 1-bit bus to signify its a constant.

您所描述的 1 位指示称为控制信号,多路复用器使用它来 select 在可能有多个输入时提供正确的输入。 MUX 是 select 或 — 它 select 在两个(或更多)选择之间。

在C语言表达式中,我们可能会写成ALUIn2 = Signal ? RegData2 : immediate,表示在1位布尔值Signal的控制下,选择某个寄存器数据值或立即数。我们会在 RegData2 = reg[source2Field]immediate = signExtend(immField) 之前。 ?: 操作就是 MUX 所做的:select 从两个(或更多)选择中选择一个。

在多路复用器的选择中,往往一个输入完全不适用而另一个完全合适。虽然控制信号是动态的,但硬件正在做的是并行计算多个选项。它不会等到它知道哪一个是当前指令的正确选择,而是计算许多可能的事情,然后再选择正确的一个。因此,每个周期都在 ignored/discarded 进行许多并行计算。

然而,地址总线可能会被绕过,以便将这些数据项直接发送到 ALU(直接对 MUX 和其他逻辑取模,查找 and/or 符号扩展)。当一个数据项在两个组件之间传送时,我们通常不会认为那是总线,而是布线。但是,它可以满足总线的某些定义。

虽然常量的宽度限制仍然存在,但这在指令集体系结构和机器代码编码中很明显,并且是程序运行的问题 with/around。硬件只需要适应指令集的最大常量大小,它通常与数据大小相同(通常与地址大小相同)。


Have a completely separate bus for a constant, and a 1-bit enable bus.

一些处理器已经有一个总线用于一个或另一个 ALU 输入。常量将被授予访问该总线的权限。

其他处理器对 ALU 输入的接线会更简单,但这种接线会在几个选项之间进行选择,就像我上面说的那样,可以看作是一个 bus-like 实体。


Pass the constant into a free register and then pass the address of that register to the ALU.

  • 处​​理器并不真正跟踪 free/busy 寄存器——这是(机器代码)程序的工作。 (这适用于架构寄存器,而不是重命名寄存器;还有一些 CPU 会广泛标记是否有任何浮点寄存器 in-use,以帮助加快不使用浮点数的进程的上下文切换)。