它每隔一段时间就会发生一次。例如,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 中减去(以计算补码)然后用进位进行加法来实现带进位的减法。
另一种选择是实现一个跳过指令,该指令检查条件标志的条件并在满足条件时跳过下一条指令。然后,您可以通过在执行加法adc
或sbc
减法之前有条件地跳过加或减 1 的指令(分别)来实现两者。但请注意,当输入为 时,这将导致进位不同0
,因此您可能需要调整设计。另一个副作用是你不再需要条件跳转了。如果不是条件+无条件跳转,则这些变为跳过。
与您之前的想法更接近的第三个选项是构建一个“应用进位”指令,该指令根据旧的进位修改前一条指令的结果。该指令将需要两个额外的状态标志(一个用于加/减,一个用于携带)但似乎更灵活。它还可以扩展为一般修饰符指令,例如区分ror
和rcr
和其他。
如果您正在为这种受限制的指令集寻找灵感,请考虑查看 PDP-8,这是一台只有 8 条指令但优雅地提供所有必需操作的著名计算机。