1

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

添加代码是:

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

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

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

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

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

4

2 回答 2

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 的最低位的(前一个)值”操作!

于 2013-09-20T07:09:51.980 回答
0

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

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

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

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

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

于 2013-09-28T05:56:57.603 回答