Assembly 带重复加法的乘法英特尔4004
谁能告诉我如何在英特尔4004上用重复加法乘以两个4位二进制数 添加代码为: 职能指令手册R0R1,0x78;初始化:R0=8 R1=7Assembly 带重复加法的乘法英特尔4004,assembly,intel,pseudocode,multiplication,microprocessors,Assembly,Intel,Pseudocode,Multiplication,Microprocessors,谁能告诉我如何在英特尔4004上用重复加法乘以两个4位二进制数 添加代码为: 职能指令手册R0R1,0x78;初始化:R0=8 R1=7 LD-R0;将R0装入蓄能器 加R1;将R1添加到累加器中 xchr1;并存储在R1中完成: 俊道;无限循环作为程序的结束 我认为逻辑是:乘法可以通过重复加法来完成 初始化指向数据位置的内存指针 将被乘数移动到寄存器 将乘法器移到另一个寄存器 清除蓄能器 向累加器添加被乘数 减量乘数 重复步骤5,直到乘法器归零 累加器中的结果存储在内存位置 此链接中的指令集用
LD-R0;将R0装入蓄能器
加R1;将R1添加到累加器中
xchr1;并存储在R1中完成:
俊道;无限循环作为程序的结束 我认为逻辑是:乘法可以通过重复加法来完成
我花了那么多时间去理解,但我不能。如果有人帮忙,我会非常感激的 您希望这样做的方式非常慢!假设您想将两个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最低位的(先前)值”操作 您希望这样做的方式非常慢!假设您想将两个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最低位的(先前)值”操作 执行此操作不需要RAM内存。4004包含几个用作存储器的索引寄存器 困难在于,所有的事情都必须用累加器完成,因为很少有操作索引寄存器的操作码:循环、算术、标志测试——因此您必须大量使用将累加器保存到索引寄存器并将其加载回累加器 即: 1.循环计数器(必须递减并检查其是否为“0”(通过测试进位)。 2.算法:将一个数字“x”自身加n次(从索引寄存器加载,并在加完后将其存储回原处) 另一个限制是,您只能在4或8位范围内进行乘法(这将导致较长的程序,因为您必须使用双寄存器)。因此,您可以在4位范围内从1x1乘法到3x4(或4x3)
由于4004似乎没有位移位操作码,因此通过加法乘法似乎是最好的方法。这样做不需要RAM内存。4004包含几个用作内存的索引寄存器 困难在于,所有的事情都必须用累加器完成,因为很少有操作索引寄存器的操作码:循环、算术、标志测试——因此您必须大量使用将累加器保存到索引寄存器并将其加载回累加器 即: 1.循环计数器(必须递减并检查其是否为“0”(通过测试进位)。 2.算法:将一个数字“x”自身加n次(从索引寄存器加载,并在加完后将其存储回原处) 另一个限制是,您只能在4或8位范围内进行乘法(这将导致较长的程序,因为您必须使用双寄存器)。因此,您可以在4位范围内从1x1乘法到3x4(或4x3)
由于4004似乎没有位移位操作码,所以加法乘法似乎是最好的方法。我实际上在写一篇媒体考古论文。我非常不懂编程。我无法理解其背后的逻辑。我真的需要找到最简单、可理解、最简单的乘法方法。但无论如何,谢谢你的回答。我我希望我能理解H。为了自己理解它,我必须用更高级的语言来写它(R,因为我让它运行)mult=function(x,y,xy=0){if(x==0)xy else mult(x%/%2,y*2,xy+if(偶(x))0 else y)}递归不变量是x*y+xy=正确的结果,重复将x减半并将y加倍。只要将x减半为近似值(x奇数),你失去了一个y,所以把它加到xy。当x=0时,你完成了。我希望这有帮助。我实际上在写一篇媒体考古论文。我非常不懂编程。我无法理解它背后的逻辑。我真的需要找到最简单、可理解、最简单的乘法方法。但无论如何,谢谢你的回答。我希望我能理解为了理解它,我必须用一种更高级的语言来编写它(R,因为我让它运行)mult=function(x,y,xy=0){if(x==0)xy-else-mult(x%/%2,y*2,xy+if(偶(x))0-else-y)}递归不变量是x*y+xy=正确的结果重复将x减半并将y加倍。每当将x减半为近似值(x奇数)时,您将丢失一个y,因此将其添加到xy。当x=0时,您就完成了。我希望这对您有所帮助。