指令集架构是否会同时受益于 ADC 和 SBC,或者所有进位指令都可以重复以前的类型?
Would an Instruction Set Architecture benefit from both an ADC and SBC, or could all carry instructions repeat the previous type?
我正在创建一个只有 16 条指令(4 位操作码,4 位立即数)的指令集,因此我想知道我是否可以同时使用 ADC(带进位加法)和 SBC(减法- with-carry) with RWC (Repeat-with-carry).
如果最后一个 add/subtract/rwc 指令是加法,则 RWC 将用作 ADC,使用其进位。
如果最后一个 add/subtract/rwc 指令是减法,则 RWC 将用作 SBC,使用它的进位(也称为借位)。
简单地说,是否需要使用进位作为借位或借位作为进位(例如:“add a,b,c; sbc d,e,f;”或“sub a ,b,c; adc d,e,f;")?此设计是否还有其他潜在限制?
它每隔一段时间就会发生一次。例如,在 add
之后 sbc
的典型用例是将进位具体化到寄存器中:
add r0, r1, r2 # r0 = r1 + r2
sbc r3, r3, r3 # r3 = -1 if addition produced carry, 0 otherwise
另一个用例是使用 adc
作为 left-rotate-through-carry,将位累积到寄存器中。要累加的位可能来自任意来源,并非所有来源都会导致指令前面加法。
另一个你应该考虑的问题是,当一个中断发生时,你需要记住刚刚发生的是加法还是减法,这样你才能正确执行下一条rwc
指令。所以标志寄存器中必须有一个额外的状态位来跟踪它。
我的建议:不要执行这个操作。相反,将减法实现为不改变标志的反向减法(即 dest = src - dest
而不是 dest = dest - src
)。然后你可以通过先从 1 中减去(计算补码)然后用进位加法来实现带进位的减法。
另一种选择是实现一个跳过指令,该指令检查条件的条件标志,如果满足条件则跳过下一条指令。然后,您可以通过在执行加法或减法之前有条件地跳过加或减 1(分别)的指令来实现 adc
和 sbc
。但请注意,当输入为 0
时,这将导致进位不同,因此您可能需要调整设计。另一个副作用是您不再需要条件跳转;这些变成 skip if not condition + unconditional jump.
第三个选择更接近您之前的想法是构建一个“应用进位”指令,根据旧的进位修改先前指令的结果。该指令需要两个额外的状态标志(一个用于 add/sub, 一个用于进位)但似乎更灵活。它也可以扩展为通用修饰符指令,例如区分 ror
和 rcr
以及其他。
如果您正在为这种受限制的指令集寻找灵感,请考虑查看 PDP-8,这是一台只有 8 条指令但优雅地提供了所有必需操作的著名计算机。
我正在创建一个只有 16 条指令(4 位操作码,4 位立即数)的指令集,因此我想知道我是否可以同时使用 ADC(带进位加法)和 SBC(减法- with-carry) with RWC (Repeat-with-carry).
如果最后一个 add/subtract/rwc 指令是加法,则 RWC 将用作 ADC,使用其进位。
如果最后一个 add/subtract/rwc 指令是减法,则 RWC 将用作 SBC,使用它的进位(也称为借位)。
简单地说,是否需要使用进位作为借位或借位作为进位(例如:“add a,b,c; sbc d,e,f;”或“sub a ,b,c; adc d,e,f;")?此设计是否还有其他潜在限制?
它每隔一段时间就会发生一次。例如,在 add
之后 sbc
的典型用例是将进位具体化到寄存器中:
add r0, r1, r2 # r0 = r1 + r2
sbc r3, r3, r3 # r3 = -1 if addition produced carry, 0 otherwise
另一个用例是使用 adc
作为 left-rotate-through-carry,将位累积到寄存器中。要累加的位可能来自任意来源,并非所有来源都会导致指令前面加法。
另一个你应该考虑的问题是,当一个中断发生时,你需要记住刚刚发生的是加法还是减法,这样你才能正确执行下一条rwc
指令。所以标志寄存器中必须有一个额外的状态位来跟踪它。
我的建议:不要执行这个操作。相反,将减法实现为不改变标志的反向减法(即 dest = src - dest
而不是 dest = dest - src
)。然后你可以通过先从 1 中减去(计算补码)然后用进位加法来实现带进位的减法。
另一种选择是实现一个跳过指令,该指令检查条件的条件标志,如果满足条件则跳过下一条指令。然后,您可以通过在执行加法或减法之前有条件地跳过加或减 1(分别)的指令来实现 adc
和 sbc
。但请注意,当输入为 0
时,这将导致进位不同,因此您可能需要调整设计。另一个副作用是您不再需要条件跳转;这些变成 skip if not condition + unconditional jump.
第三个选择更接近您之前的想法是构建一个“应用进位”指令,根据旧的进位修改先前指令的结果。该指令需要两个额外的状态标志(一个用于 add/sub, 一个用于进位)但似乎更灵活。它也可以扩展为通用修饰符指令,例如区分 ror
和 rcr
以及其他。
如果您正在为这种受限制的指令集寻找灵感,请考虑查看 PDP-8,这是一台只有 8 条指令但优雅地提供了所有必需操作的著名计算机。