我需要将两个4字节数相乘。我可以将这些值存储在x,y,z寄存器中但是如何将它们相乘,因为我一次只能乘以8x8位?我知道如何在dseg中分配内存,但不能在那里执行算术函数。 我用于模拟的设备是169p和2560.Mul可能会被使用。
我尝试过使用x,y,z寄存器,但我无法想象如何处理这些寄存器等。我知道它们可以在寄存器0,1中找到,所以第四。我试图分配大到足以存储算术数字的内存位置,但无论如何我都必须将它们移动到寄存器中进行操作。
答案 0 :(得分:0)
您可以为自己实现任何众所周知的乘法算法,或者,如果您坚持在现有的8位乘法基础上构建,则可以使用一些基本代数。 16位情况的示例,s = 2 ^ 8:
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位,这会更复杂一些;)
答案 1 :(得分:0)
我使用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