Dat*_*net 4 assembly instruction-set cpu-architecture carryflag
我正在创建一个仅包含 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;")?这种设计是否还有其他潜在的限制?
它每隔一段时间就会发生一次。例如,sbc以下 an的典型用例add是将进位具体化到寄存器中:
add r0, r1, r2 # r0 = r1 + r2\nsbc r3, r3, r3 # r3 = -1 if addition produced carry, 0 otherwise\nRun Code Online (Sandbox Code Playgroud)\n另一个用例是用作adc左循环进位,将位累加到寄存器中。要累加的位可能来自任意源,并非所有源都会导致指令前面有加法。
您应该考虑的另一个问题是,当发生中断时,您需要记住是否刚刚发生加法或减法,以便rwc正确执行下一条指令。因此,标志寄存器中必须有一个额外的状态位来跟踪这一点。
我的建议:不要执行此操作。相反,将减法实现为不改变标志的反向减法(即dest = src - dest代替)。dest = dest - src然后,您可以通过首先从 1 中减去(计算补码)然后使用进位进行加法来实现带进位的减法。
另一种选择是实现一条跳过指令,该指令检查条件标志,并在满足条件时跳过下一条指令。然后,您可以通过在执行加法或减法之前有条件地跳过加或减 1(分别)的指令来实现adc和。sbc但请注意,这将导致输入为 时进位有所不同0,因此您可能需要调整设计。另一个副作用是你不再需要条件跳转;这些变成如果不是条件则跳过+无条件跳转。
第三个选项更接近您之前的想法,而是构建一个 \xe2\x80\x9capply 进位 in\xe2\x80\x9d 指令,该指令根据旧进位修改前一个指令的结果。该指令需要两个额外的状态标志(一种用于添加/订阅,一种用于进位)但似乎更灵活。它还可以扩展为通用修饰符指令,例如区分rorandrcr和 other。
如果您正在寻找这种受限指令集的灵感,请考虑查看 PDP-8,这是一款著名的计算机,只有 8 条指令,但却优雅地提供了所有必需的操作。
\n