【发布时间】: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