【问题标题】:How to set jump condition for an 8-bit computer?8位计算机如何设置跳转条件?
【发布时间】:2021-11-03 16:14:48
【问题描述】:

我一直在学习名为nand2tetris 的课程。其中,我们构建了一台 16 位计算机,每条指令的第一位选择地址模式或命令模式,即如果为 0,则加载地址寄存器,如果为 1,则执行一条指令。最后 3 位指定跳转条件(基于 ALU 输出),如下所示:

000 - no jump
001 - jump if greater than 0
010 - jump if equal to 0
011 - jump if greater than or equal to 0
100 - jump if less than 0
101 - jump if not equal to 0
110 - jump if less than or equal to 0
111 - jump

假设我正在制作一台 8 位计算机,而我只有 1 位来指定跳转指令。如果是0,不跳转,如果是1,如果ALU输出为0,则跳转。我将如何进行其他比较?我的猜测是将条件存储在寄存器中,即 ALU 在寄存器 0 中存储“大于”(如果为真则为 0),在寄存器 1 中存储“大于或等于”,在寄存器 2 中存储“小于”,依此类推.当我想检查不等式时,我将值加载到地址寄存器中,如果为 0 则跳转。

// greater than or equal to loaded in address register
// below is equivalent to ld 0x03
ld geq
// set D register to value in geq
mv D M
// "loop" line address loaded in address register
ld loop
// goto "loop" if D is 0 else continue
D: jp

这是正确的方法吗?在 16 位计算机中,与单行指定跳转规范相比,这是 4 行指令!必须有一种更简单更好的方法来指定。

【问题讨论】:

  • 您的 ALU 有“进位”位吗?这将在加法/减法之后设置为算术上溢/下溢,并左移/右移,然后你的条件跳转是'jump on carry set'
  • 没有。指令是这样的 1 aaaasdj - “aaaa”是 ALU 参数,它类似于书中的 - 取反 x,取反 y,加或与,取反输出(在书中你还有 2 个 - 零 x 和零 y) .我可以将最后一个设置为携带,前 3 个设置为选择器,也许?
  • 我能做到。 4 位,即 16 个操作码。我可以在其中包含大于和不等于,并且可以使用它。

标签: assembly cpu-architecture low-level 8-bit


【解决方案1】:

aaaa 中有免费的操作码吗?

如果是这样,您可以添加“大于 0”和“大于或等于 0”操作码。例如,它们会检查 D 寄存器的值并将其替换为布尔值 1 或 0。

因此,您的比较序列是减去两项,然后使用其中一个操作码,然后您的条件跳转到零。

您可以将操作数交换为减法以获得其他关系(小于、小于零)。

您还可以从布尔值中减去 1 来反转它(使真 0 并使假非零)。

或者,您可以移开除符号位之外的所有位,即逻辑右移 15 位会将符号位移动到低位位置 — 这将为您提供 >= 0 的 0 和 = 0 的 0 和


正如@Peter 指出的那样,比较指令可以在没有溢出风险的情况下运行。 MIPS 提供单个比较,slt,代表小于。 MIPS 还提供条件为真时的分支以及条件为假时的分支。这与交换操作数的能力相结合,允许所有 4 种关系操作(、>=)。

【讨论】:

  • 因此,您的比较序列是减去两个项目,然后使用这些操作码之一 - 如果减法遇到有符号溢出,则会失败。在这种情况下,符号位不反映比较结果。对于没有 FLAGS 的机器来说,一个更好的选择是 MIPS 所做的:产生 0 或 1 比较结果的比较寄存器。 (sltsltu)。我没有阅读太多问题,所以也许我错过了一些安全的原因,比如寄存器中可能有多余的高位,并且值在输入时正确符号扩展?
  • @PeterCordes,谢谢这些都是好点;我想我不确定溢出对分配是否重要,但这是 OP 需要考虑的事情。
猜你喜欢
  • 1970-01-01
  • 2019-02-28
  • 2021-03-18
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多