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