【问题标题】:How does an instruction decoder work?指令解码器如何工作?
【发布时间】:2015-01-06 21:47:34
【问题描述】:

在对指令集的赋值中,我们被告知为不同架构模型所需的算术运算编写指令序列:累加器、堆栈、加载/存储、内存/内存。

给定:

  • 操作码 - 8 位
  • 内存地址 - 16 位
  • 所有寄存器都用 4 位编码
  • 所有数据操作数 - 32 位
  • 所有指令必须是偶数字节,即 8 x N 位,其中 N 是自然数。

并且! 寄存器地址可以打包在一起

问题 1: 我们什么时候将两个寄存器打包在一起?系统如何知道它不是一个编码为 4 位的寄存器?可以举个例子吗?

假设我们得到 A = B + C。加载/存储模型中此操作所需的指令:

1. load r2, B;
2. load r3, C;
3. add r1, r2, r3;
4. store r1, A.

第一条指令是 28 位长,所以我们需要额外的 4 位。

问题 2:将 4 位以 0000 的形式放在哪里有区别吗?整数字节的指令怎么做?

非常感谢您的帮助。

【问题讨论】:

  • 这取决于你如何设计你的指令集。也许您需要一个 NOP 运算符,它是一个无操作的 4 位指令,您可以在任何最终得到非 32 位大小的地方填充。
  • 感谢您的回复。你能告诉我,我们什么时候想把两个寄存器合二为一? F.e.,我使用寄存器 r1 和 r2 并编码它们看起来像 0001 和 0010。我可以只用 4 位写它们吗?他们会是什么样子?像0110这样的东西?我完全糊涂了。
  • 就像我说的,这取决于你。这是您的指令集,由您决定如何表示它。

标签: assembly arm intel computer-architecture cpu-architecture


【解决方案1】:

虽然这个问题看起来有点含糊,但我会冒险回答并可能会引发有用的讨论。

问题 1:我们什么时候将两个寄存器打包在一起?系统如何知道它不是一个编码为 4 位的寄存器?能不能请你 举个例子?

CPU中的ID(指令解码器)会先读取操作码。这意味着一旦它知道它必须解码的指令,它就知道如何解释以下位。您可以在 4 位上对寄存器进行编码,这意味着您有 16 个寄存器。但是假设您有一条指令,该指令仅限于对 4 个寄存器子集中的 2 个寄存器进行操作。在这种情况下,您只能使用 4 位来识别 2 个寄存器。通过这种方式,您将 2 个寄存器的 “标识符” 打包成 4 位。

问题 2:将 4 位以 0000 的形式放在哪里有区别吗?你将如何制作一个整数的指令 字节?

它会计算你放置 4 位的位置。 根据每个操作码,指令解码器知道从哪里获取它使用的寄存器的地址。例如,对于 load 指令,如果您将指令设计为紧跟在操作码之后的 4 位,当解码器识别出 load 时,if 会将接下来的 4 位解释为注册标识符。

我不认为您必须使用整数字节,因为指令中的每一位都有意义。指令可以是整数字节,只包含一些未使用的位(通常在末尾)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2011-04-08
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多