【问题标题】:Can you only perform arithmetic in registers when programming in atmel studios?在 atmel 工作室编程时只能在寄存器中执行算术吗?
【发布时间】:2014-02-21 02:53:16
【问题描述】:

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

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

【问题讨论】:

  • 谢谢小丑的回复小丑。我可能很快就会找到解决方案

标签: assembly atmel


【解决方案1】:

您可以自己实现任何著名的乘法算法,或者,如果您坚持在现有的 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 位,这会稍微复杂一点 ;)

【讨论】:

    【解决方案2】:

    我完成了使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多