【问题标题】:Shift Right Logical from an ADD and NAND? [duplicate]从 ADD 和 NAND 右移逻辑? [复制]
【发布时间】:2013-02-13 00:08:51
【问题描述】:

第二次问这个问题是因为上次人们回避了我的问题并提出了我无法使用的解决方案。我正在用一种非常简单的汇编语言制作乘法器,其中我有 BEQ、NAND 和 ADD 来创建 SRL。我还必须将乘数保持在 50 行以下(到目前为止使用了 16 行),因此希望该解决方案可以循环使用。

我的问题是如何仅使用 NAND 和 ADD 实现 SRL

注意:请不要建议将一个数字与自身相加 x 次来相乘。我现在正在研究的方法可以通过解决SRL问题来完成。

谢谢。

【问题讨论】:

    标签: assembly add bit-shift


    【解决方案1】:

    我认为人们没有“回避”你的问题。这没什么好用的。 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:
    

    【讨论】:

    • 你也有 AND 而不是 NAND
    • 我以为每个人都能猜到NAND(1,NAND(a,b)) == AND(a, b)
    • 我应该提到,当然是一个词而不是一个位,你想要NAND(all ones, NAND(a,b)),或者如果你有二进制补码算法,那么NAND(-1, NAND(a,b))
    • @AkiSuihkonen 只有 NAND 或 NOR 你可以做任何布尔逻辑表达式,一些早期的可编程芯片确实有 1 或 2 个 NAND/NOR 阵列
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多