第二次问这个问题,因为上次人们回避了我的问题并提出了我无法使用的解决方案。我正在用一种非常简单的汇编语言制作乘法器,其中我有 BEQ、NAND 和 ADD 来创建 SRL。我还必须将乘数保持在 50 行以下(到目前为止使用了 16 行),因此希望该解决方案可以循环使用。
我的问题是如何仅使用 NAND 和 ADD 实现 SRL
注意:请不要建议通过将一个数字添加到自身 x 次来相乘。我现在正在研究的方法可以通过解决 SRL 问题来完成。
谢谢。
我不认为人们“回避”了你的问题。这没什么好用的。NAND按位运行,因此您唯一希望通过指令获取位位置之间的信息是加法中的进位。我们有x+x = SLL x
. 你没有说你的处理器。如果您有寄存器对,您可以将 x 加载到一对寄存器的低位寄存器中,然后为 N 位宽的寄存器左移 N-1 次。高寄存器将有你需要的东西。
否则会有一个测试和设置循环。
ans = 0
test = 2
set = 1
next:
if NAND(-1,NAND(x,test)) == 0 goto skip_set
ans = ans + set
skip_set:
set = set + set
test = test + test
if test == 0 goto done
goto next
done:
最后,如果你的词很窄,你可以在内存中写一个表格。
我知道您正在寻找 SRL,但当然可以仅使用 SLL 实现乘法。对于x*y
,它会是这样的:
ans = 0
test = 1
next:
if NAND(-1,NAND(x,test)) == 0 goto skip
ans = ans + y
skip:
y = y + y
test = test + test
if test == 0 goto done
goto next
done: