8位计算机如何设置跳转条件?

How to set jump condition for an 8-bit computer?

我一直在上一门名为 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),在寄存器 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行指令!必须有一个简单的更好的方法来指定。

你在 aaaa 中有免费的操作码吗?

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

因此,您的比较序列是减去两项,然后使用这些操作码之一,并且您的条件跳转到零。

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

您也可以从布尔值中减去 1 来反转它(使 true 为 0,使 false 非零)。

或者,您可以移开除符号位以外的所有位,即逻辑右移 15 位会将符号位移至低位位置——这将为 >= 0 提供 0,为 < 0 提供 1。 (算术右移 15 位将为 >= 0 提供 0,为 < 0 提供 -1。)


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