乘法重复加法英特尔4004

时间:2013-09-19 12:26:51

标签: assembly intel pseudocode multiplication microprocessors

有人能告诉我如何在英特尔4004上重复添加两个4位二进制数?

添加代码为:

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

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

  1. 将内存指针初始化为数据位置。
  2. 将被乘数移动到寄存器。
  3. 将乘数移至另一个寄存器。
  4. 清除累加器。
  5. 将被乘数添加到累加器
  6. 递减乘数
  7. 重复步骤5直到乘数变为零。
  8. 累加器中的结果存储在内存位置。
  9. 指令集位于此链接中:http://www.e4004.szyc.org/iset.html

    我花了很多时间去理解,但我做不到。如果有人帮忙,我会非常感激。

2 个答案:

答案 0 :(得分: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”操作最低位的(前一个)值!

答案 1 :(得分:0)

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

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

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

另一个问题是你只能在4或8位范围内相乘(这会导致程序更长,因为你必须使用双寄存器)。所以你可以从1x1乘以3x4(或4x3) - 在4位范围内。

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