4

我正在创建一个只有 16 条指令(4 位操作码,4 位立即数)的指令集,因此我想知道是否可以同时使用 ADC(带进位加法)和 SBC(带进位减法)替换RWC(重复携带)。

如果最后一个加/减/rwc 指令是加法,RWC 将用作 ADC,使用它的进位。

如果最后一个加/减/rwc 指令是减法,RWC 将用作 SBC,使用其进位(也称为借位)。

简而言之,是否需要使用进位作为借位或借位作为进位(例如:“add a,b,c; sbc d,e,f;”或“sub a,b,c; adc d,e,f;")? 这种设计是否还有其他潜在的限制?

4

1 回答 1

5

它每隔一段时间就会发生一次。例如,sbc遵循 an的典型用例add是将进位具体化到寄存器中:

add r0, r1, r2  # r0 = r1 + r2
sbc r3, r3, r3  # r3 = -1 if addition produced carry, 0 otherwise

另一个用例是adc用作左循环进位,将位累加到寄存器中。要累积的位可能来自任意来源,并非所有来源都会导致指令前面有加法。

您应该考虑的另一个问题是,当中断发生时,您需要记住是否刚刚发生加法或减法,以便rwc正确执行下一条指令。所以标志寄存器中必须有一个额外的状态位来跟踪它。

我的建议:不要执行此操作。而是将减法实现为不改变标志的反向减法(即dest = src - dest代替)。dest = dest - src然后,您可以通过首先从 1 中减去(以计算补码)然后用进位进行加法来实现带进位的减法。

另一种选择是实现一个跳过指令,该指令检查条件标志的条件并在满足条件时跳过下一条指令。然后,您可以通过在执行加法adcsbc减法之前有条件地跳过加或减 1 的指令(分别)来实现两者。但请注意,当输入为 时,这将导致进位不同0,因此您可能需要调整设计。另一个副作用是你不再需要条件跳转了。如果不是条件+无条件跳转,则这些变为跳过。

与您之前的想法更接近的第三个选项是构建一个“应用进位”指令,该指令根据旧的进位修改前一条指令的结果。该指令将需要两个额外的状态标志(一个用于加/减,一个用于携带)但似乎更灵活。它还可以扩展为一般修饰符指令,例如区分rorrcr和其他。

如果您正在为这种受限制的指令集寻找灵感,请考虑查看 PDP-8,这是一台只有 8 条指令但优雅地提供所有必需操作的著名计算机。

于 2022-02-19T20:06:22.930 回答