Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly (汇编-8085)将32位数字相乘_Assembly_32 Bit_Multiplication_8085 - Fatal编程技术网

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

Assembly (汇编-8085)将32位数字相乘,assembly,32-bit,multiplication,8085,Assembly,32 Bit,Multiplication,8085,我和我的朋友正在尝试编写一个代码,我们需要将两个32位的数字相乘,得到一个64位的数字。 我们想用加法将数字相乘,问题是寄存器一次只能存储8位(每对16位)。我们一直在寻找解决方案,很难找到任何对这种情况真正有帮助的方法。 你能告诉我们怎么做吗?加法就是加法,我们在小学就学会了加法 99 + 1 ==== 9+1=0携带1,我们做两次,然后得到0+1=1 11 99 + 1 ==== 100 不管是什么基,在二进制中,我们可以有: 111 +001 ==== 相同的交易,基数

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

加法就是加法,我们在小学就学会了加法

 99
+ 1
====
9+1=0携带1,我们做两次,然后得到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。该进位是下一列twos列的进位。即进位为1加1+0=0,进位为1。四列与进位为1的两列1+1+0=0相同。第八列是1+0+0=1的进位,进位为0。每一列的工作原理相同,将进位加操作数a加操作数b加在一起,然后得到一个结果位和一个进位。你可以把它们链在一起,你想链多宽就链多宽,数百万比特,数十亿比特,无限大

因此,汇编通常会在这里为您提供一些支持。您的alu倾向于在某些处理器状态寄存器中有一个进位标志位。你有两个操作数和一个结果,中间进位变成进位是在alu本身中管理的,你看不到它们。有时,您有一个普通的add指令和另一个add with carry指令,其中进位标志是进位,然后进位也在进位中,因此对于这样的系统,您可能会

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位部分,对它们进行组织,以便在第二次加法中先处理低位字节,然后处理下一个高位字节,依此类推。正确地将一个阶段的进货链接到下一个阶段的进货


不知道为什么在寻找解决方案时出现问题。小学数学涵盖了计数、加法和结转到下一列的基础知识,然后将其带到说明集文档中,其中描述了加法和如果有带进位的加法。显示加法操作修改进位,带进位加法使用并修改进位

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

lxib,AA55h lxid,BB22h;柜台 LXI-H,0000h;16位进位初始化

开始: MOV A,C 加C 莫夫C,A

MOV A,B ADC B 莫夫B,A

JNC进货 INX H 进位:DCX-D;减量计数器 JNZ启动

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

请解释为什么您不满意将值保留在内存中(包括堆栈)。我不明白如何存储该维度的数字,因为它大于16位。。我是大会的新手,这似乎是一个简单的问题。我想把这个数字分成8位,然后存储在寄存器中进行计算。但是,我看不到一种方法来编写能够添加N次数字的代码,因为寄存器只能使用255次(在使用寄存器作为计数器来知道何时停止添加循环的情况下),如果您是汇编新手,但对其他一些语言(C等)来说已经很老了,也许您应该在那里模拟解决方案以进行快速开发,一旦你弄明白了,就把它移植到asm。定义你所说的“添加方法”是什么意思。简单地添加一个循环?类似于program:jmp loop loop:add5(示例)jmp程序非常感谢您的解释,我真的很困惑,我现在应该知道解决问题的方法了