Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 在atmel Studio中编程时,只能在寄存器中执行算术运算吗?_Assembly_Atmel - Fatal编程技术网

Assembly 在atmel Studio中编程时,只能在寄存器中执行算术运算吗?

Assembly 在atmel Studio中编程时,只能在寄存器中执行算术运算吗?,assembly,atmel,Assembly,Atmel,我需要两个4字节的数字相乘。我可以将这些值存储在x、y、z寄存器中,但既然一次只能乘法8x8位,那么如何将它们相乘呢?我知道如何在dseg中分配内存,但在那里无法执行算术函数。 我用于模拟的设备是169p和2560。可以使用Mul 我试过使用x、y、z寄存器,但我不知道如何处理进位等。我知道它们可以在寄存器0、1等中找到。我试图分配足够大的内存位置来存储算术数字,但无论如何我都必须将它们移动到寄存器中进行运算。您可以自己实现任何著名的乘法算法,或者,如果您坚持在现有8位乘法的基础上构建,您可以使

我需要两个4字节的数字相乘。我可以将这些值存储在x、y、z寄存器中,但既然一次只能乘法8x8位,那么如何将它们相乘呢?我知道如何在dseg中分配内存,但在那里无法执行算术函数。 我用于模拟的设备是169p和2560。可以使用Mul


我试过使用x、y、z寄存器,但我不知道如何处理进位等。我知道它们可以在寄存器0、1等中找到。我试图分配足够大的内存位置来存储算术数字,但无论如何我都必须将它们移动到寄存器中进行运算。

您可以自己实现任何著名的乘法算法,或者,如果您坚持在现有8位乘法的基础上构建,您可以使用一些初等代数。s=2^8的16位情况示例:

op1 = a*s + b
op2 = c*s + d
op1 * op2 = (a*s + b) * (c*s + d) = a*c*s*s + b*c*s + a*d*s + b*d
这里所有的变量乘法都是8位的,结果是16位的。根据
s
的幂,将部分项添加到最终结果中


对于32位,这将稍微复杂一点;)

我完成了使用Atmel AVR将$A3B4和$421C相乘的问题。下面是所有正在寻找此示例的人的代码。最终答案存储在数据位置0x2000-0x2003

ldi yl,0xB4
 ldi yh,0xA3
 ldi zl,0x1c
 ldi zh,0x42

 mul zl,yl

 mov r15,r0
 mov r16,r1

 mul zl,yh

 mov r17,r0
 mov r18,r1

 mul zh,yl

 mov r19,r0
 mov r20,r1

 mul zh, yh

 mov r21,r0
 mov r22,r1

 adc r16,r17
 adc r16,r19
 adc r18,r20
 adc r18,r21

 ldi r25,0
 adc r22,r25

 ldi yl,0x00
 ldi yh,0x20

 std y+0,r22
 std y+1,r18
 std y+2, r16
 std y+3, r15

谢谢杰斯特的回复,杰斯特。我可能很快就会找到解决办法