【问题标题】:How do I compute the 16-bit dot product of two arrays containing 8-bit values?如何计算两个包含 8 位值的数组的 16 位点积?
【发布时间】:2016-12-07 11:08:47
【问题描述】:

另一个组装问题!

使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学课程编写一个函数,该函数计算两个数组的点积并将其作为 16 位整数返回。数组长度相等,每个都包含一组 8 位值。该函数应该接受这两个字节数组和一个表示数组长度的字节作为参数。我可以使用分支指令等。

这是我目前所拥有的:

.global dot
dot:
  mov r18,r22
  mov r19,r23
  movw r26,r18
  mov r30,r24
  mov r31,r25
  ldi r18,lo8(0)
  ldi r19,hi8(0)
  jmp exit_if
  compute:
    ld r25,Z+
    ld r22,X+
    muls r22,r25
    movw r22,r0
    clr r1
    add r18,r22
    adc r19,r23
  exit_if:
    mov r25,r30
    sub r25,r24
    cp r25,r20
    brlt compute
    movw r24,r18
    ret

我知道这有点像怪物......

由于某种原因,当我有数组字节 a[] = {7, 20, 19, 11, 4} 和字节 b[] = {132, 51, 0, 84, 30} 时,长度参数等于到 5(显然),它不会像预期的那样返回 2988。有谁知道出了什么问题?任何帮助将不胜感激!

【问题讨论】:

  • 您可能想用 cmets 对您的代码进行一些注释。即使假设我们熟记指令集和 ABI,这也不能说明您的子程序的预期参数是什么。
  • 为什么不使用 C 编译器? AVR 被设计成一个很好的编译器目标,所以编写一个接受 args 并返回结果的函数,并查看 gcc 的输出。
  • b[0]=132 与程序集不匹配。乘法是有符号的,所以是 -124。

标签: arrays assembly arduino average avr


【解决方案1】:

尝试将您的代码转换为稍高的抽象级别。

.global dot
dot:
  mov r18,r22
  mov r19,r23
/* r18r19 = r22r23; */
  movw r26,r18
/* X = r26r27 = r18r19; */
  mov r30,r24
  mov r31,r25
/* Z = r30r31 = r24r25; */
  ldi r18,lo8(0)
  ldi r19,hi8(0)
/* r18r19 = 0; */
/* jmp - innerlabel - testlabel pattern: while() loop */
  jmp exit_if
  compute:
    ld r25,Z+         // r25 = *(Z++)
    ld r22,X+         // r22 = *(X++)
    muls r22,r25      // multiplies vector elements, result in r0:r1
    movw r22,r0       // r22r23 = a[i]*b[i], signed
    clr r1            // r1=0
    add r18,r22
    adc r19,r23       // r18r19 += r22r23
  exit_if:
    mov r25,r30     // r25 = r30;
    sub r25,r24     // r25 -= r24;  8-bit count of how many bytes have been read
    cp r25,r20      // compare to r20
    brlt compute    // if r25<r20 loop
    movw r24,r18    // r24r25 = r18r19
    ret

在入口处找到寄存器含义:r20 是向量长度。 r24r25 是一个向量位置。 r22r23 是另一个向量位置。由于某些莫名其妙的原因,用于跟踪循环中和的 r18r19 临时保存了其中一个指针的副本。结果最终放置在 r24:r25 中。

这似乎可以合理地执行任务。所以下一个问题确实是 ABI 和论点到底是什么。

【讨论】:

  • 是的,感谢您对我的代码进行注释,很抱歉之前没有自己做。我还编辑了我原来的问题,以添加差异的来源。
【解决方案2】:

大家都明白了。

为了线

muls r22, r25

我应该做到的

mul r22, r25

所以这只是一封小信。对不起!

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多