【问题标题】:Multiplication with repeated Addition Intel 4004重复加法乘法 Intel 4004
【发布时间】:2013-09-19 12:26:50
【问题描述】:

谁能告诉我如何在 Intel 4004 上将两个 4 位二进制数相乘并重复加法?

添加代码为:

FIM R0R1, 0x78 ;初始化:R0=8 R1=7
LD R0 ;将 R0 装入累加器
添加 R1 ;将 R1 添加到累加器中
XCH R1 ;并存储在 R1 中:
君完成;无限循环作为程序结束

我认为逻辑是:乘法可以通过重复加法来完成。

  1. 初始化指向数据位置的内存指针。
  2. 将被乘数移动到寄存器中。
  3. 将乘法器移动到另一个寄存器。
  4. 清空蓄能器。
  5. 将被乘数添加到累加器
  6. 递减乘数
  7. 重复第 5 步,直到乘数归零。
  8. 累加器中的结果存储在内存位置。

指令集在这个链接可以到达:http://www.e4004.szyc.org/iset.html

我花了很多时间去理解,但我不能。如果有人提供帮助,我将非常感激。

【问题讨论】:

    标签: assembly intel pseudocode multiplication microprocessors


    【解决方案1】:

    您希望这样做的方式非常缓慢!假设你想将两个 32 位数字相乘(你可以用 8080 来做,4004 没有足够的内存):当两个数字都大于 1000000 时,相乘会花费很多时间。

    一个更好的算法应该是这样的:

      set result = 0
      set A = first number
      set B = second number
    loop:
      if the lowest bit of A is 0 then jump to "no_add"
      add B to result
    no_add:
      shift A right (logic, not arithmetic!) one bit
      shift B left one bit
      if A is not zero then jump to "loop"
    

    使用“循环进位”操作,您可以使用一条指令执行“将 A 右移一位”和“检查 A 的最低位的(前一个)值”操作!

    【讨论】:

    • 我实际上是在写一篇媒体考古文章。我非常不从事编程业务。我无法理解其背后的逻辑。我真的需要找出最简单、易理解、最简单的乘法方法。但无论如何,谢谢你的回答。我希望我能理解。
    • 为了自己理解它,我不得不用更高级的语言(R,只是因为我运行它)mult = function(x, y, xy = 0) { if(x = = 0) xy else mult(x%/%2, y * 2, xy + if(even(x)) 0 else y)}
    • 递归不变量是 x * y + xy = 正确的结果 你重复减半 x 和加倍 y。每当将 x 减半是近似值(x 奇数)时,您将失去一个 y,因此将其添加到 xy。当 x = 0 时,你就完成了。我希望这会有所帮助。
    【解决方案2】:

    您不需要 RAM 内存来执行此操作。 4004 包含几个用作存储器的索引寄存器。

    困难在于所有事情都必须用累加器完成,因为很少有操作码可以操作索引寄存器:循环、算术、标志测试 - 所以你必须大量使用保存累加器索引寄存器并将其加载回累加器。

    即: 1.循环计数器(必须递减并检查它是否为“0”(通过测试进位位)。 2. 算术:将一个数字“x”添加到自身 n 次(从索引寄存器加载它并 - 添加完成后 - 将其存储回那里)

    另一个限制是您只能在 4 或 8 位范围内进行乘法运算(这会导致程序更长,因为您必须使用双寄存器)。所以你可以从 1x1 乘以 3x4(或 4x3)——在 4 位范围内。

    由于 4004 似乎没有位移操作码,所以乘法相加似乎是最好的方法。

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2020-04-02
      相关资源
      最近更新 更多