(汇编 - 8085)将32位数字相乘

时间:2013-12-20 19:11:45

标签: assembly 32-bit multiplying 8085

我和我的朋友正在尝试编写一个代码,我们需要将两个32位数相乘,得到64位数。 我们想使用add方法乘以数字,问题是寄存器一次只能存储8位(每对16位)。我们一直在寻找解决方案,很难找到对这种情况真正有用的东西。 你能否告诉我们如何做到这一点?

2 个答案:

答案 0 :(得分:2)

另外补充,在小学学习了补充。

 99
+ 1
====

9 + 1 = 0携带一个,我们这样做两次,然后得到0 + 1 = 1

 11
  99
+  1
====
 100

无论什么基础,二进制我们可以有这个:

 111
+001
====

相同交易,基数2,1 + 1 = 0进1,重复直到1 + 0 = 1

 111
  111
+ 001
=====
 1000

但与纸和铅笔不同,我们对计算机中的位数有更强的限制,但这并没有改变它的工作方式。

我可以解决先前的问题并将其分成两个比特大小的寄存器。

 11 11
  1  11
+ 0  01
===  ==
 10  00

第一个是低位两位11 + 01我们做数学运算得到00,进位为1.第二个运算采用先前运算的执行使用那个作为进位,然后我们加01 + 00,进位为1,进位为0,得到10。

没有什么魔法。

然后让我们获得更多基础

 01 11 11 10
  0  1  1  1
+ 0  0  0  1
 == == == ==
  1  0  0  0 

我们从lsbit开始,其中1 + 1的进位为0,所以0 + 1 + 1 = 0,进位为1.执行的是下一列的进位二进制列。这是1加1 + 0 = 0的进位,进位为1.四进制列与二进制1 + 1 + 0 = 0相同,进位为1.十进制列是进位1 + 0 + 0 = 1,进位为0.每列工作相同的三个东西加在一起进位加操作数加上操作数b然后你得到一个结果位和一个进位。你可以根据自己的意愿将这些链接在一起,数百万比特,数十亿比特,无限。

所以汇编一般会给你一些支持。你的alu往往有一个进位,往往会进入某个处理器状态寄存器中的进位标志位。你有两个操作数和一个结果,中间进位成为进位是在alu本身管理,你不会看到那些。有时你有一个正常的加法指令和另一个带进位指令的加法,其中进位标志是进位,然后进位位于进位位,因此对于像你那样的系统

add
adc
adc
adc
...

对于您想要的宽泛的一组值,通常受到您拥有的内存量或其他类似限制(寄存器数量)的限制。

如果你没有携带,那么你必须合成

add
jnc lab0
add #1
lab0:
add
jnc lab1
add #1
lab1:

某些指令集只有一个带有进位的附加

clc ; clear carry bit
add
add
add
add
...

我显然将寄存器/操作数从这些指令中删除,因为它们对于“我如何进行比寄存器中的位数更大的数学运算”类型的问题并不重要。如上所示,使用1位和2位数学运算,您需要准备数据并根据您正在处理的列将其放在操作数中。如果你有8位寄存器和8位alu,那么你将N位操作数分成8位部分,组织它们,使你先处理较低的字节,然后再处理第二个字节中的下一个高位字节,依此类推。正确地将你的一个阶段的进行链接到下一阶段的进位。

不确定为什么搜索解决方案有任何问题。小学数学涵盖了计数和添加的基础知识并将其转移到下一栏,然后将其带到指令集文档中,其中描述了添加以及是否添加了携带。显示添加操作会修改进位,带有进位的添加使用并修改进位。

答案 1 :(得分:0)

让两个数字分别为AA55h和BB22h。 我们将使用第二个数字作为计数器。 ALP是:

LXI B,AA55h LXI D,BB22h;计数器 LXI H,0000h; 16位进位初始化

开始: MOV A,C 添加C. MOV C,A

MOV A,B ADC B MOV B,A

JNC Carry       INX H. 携带:DCX D;递减计数器          JNZ开始

;; 16位进位已存储在HL对中 ;; 16位结果已存储在BC对