在 atmel 工作室编程时只能在寄存器中执行算术吗?

Posted

技术标签:

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

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

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

【问题讨论】:

谢谢小丑的回复小丑。我可能很快就会找到解决方案 【参考方案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

【讨论】:

以上是关于在 atmel 工作室编程时只能在寄存器中执行算术吗?的主要内容,如果未能解决你的问题,请参考以下文章

CPU类

在 Atmel SAMD21J18A 微控制器中查找剩余的闪存大小?

ATMEL328的c库创建

一条指令在cpu中的执行流程(理解CPU组成)

在 Atmel AVR studio 中使用 ATMega2560 读取 RC PWM 信号

Atmel studio 汇编:8 位数字的平方根