有人能告诉我如何在英特尔4004上重复添加两个4位二进制数?
添加代码为:
FIM R0R1,0x78;初始化:R0 = 8 R1 = 7
LD R0;将R0加载到蓄电池中
添加R1;将R1添加到累加器中
XCH R1;并在R1完成存储:
JUN完成了;无限循环作为程序结束
我认为逻辑是:乘法可以通过重复添加来完成。
指令集位于此链接中:http://www.e4004.szyc.org/iset.html
我花了很多时间去理解,但我做不到。如果有人帮忙,我会非常感激。
答案 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似乎没有位移位操作码,因此乘法相加似乎是最好的方法。