【问题标题】:How do I compute the 16-bit sum of the 8-bit values of an array in assembly?如何计算汇编中数组的 8 位值的 16 位和?
【发布时间】:2016-12-05 15:22:49
【问题描述】:

感觉我最近一直在问很多这些问题,哈哈,但是组装对我来说仍然很陌生。

使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学课程编写一个函数,该函数计算数组中 8 位值的总和并将其作为 16 位整数返回。该函数应该接受一个字节数组和一个表示数组长度的字节作为参数,当调用函数时,这些参数分别存储在 r24 和 r22 中。我可以使用分支指令等。

代码格式如下:

.global sumArray
sumArray:
  //magic happens
  ret

我知道如何创建循环并增加计数器之类的东西,但我真的不知道该怎么做。

我不确定我将如何做到这一点。有谁知道如何在 Atmel AVR Assembly 中编写这个函数?任何帮助将不胜感激!

【问题讨论】:

  • 提示:使用ADDADC

标签: arrays assembly arduino sum avr


【解决方案1】:

你为什么不向你的编译器提出这个问题?

#include <stdint.h>

uint16_t sumArray(uint8_t *val, uint8_t count)
{
    uint16_t sum = 0;
    for (uint8_t i = 0; i < count; i++)
        sum += val[i];
    return sum;
}

使用avr-gcc -std=c99 -mmcu=avr5 -Os -S sum8-16.c 编译生成 以下程序集:

.global sumArray
sumArray:
    mov  r19, r24
    movw r30, r24
    ldi  r24, 0
    ldi  r25, 0
.L2:
    mov  r18, r30
    sub  r18, r19
    cp   r18, r22
    brsh .L5
    ld   r18, Z+
    add  r24, r18
    adc  r25,__zero_reg__
    rjmp .L2
.L5:
    ret

这可能不是最直接的解决方案,但如果您学习 这段代码,你可以理解它是如何工作的,并希望能附带 你自己的版本。

【讨论】:

  • 啊,好的,谢谢,我之前一直在尝试godbolt.org,这个解决方案更加清晰。非常感谢!
  • 不知道这个网站,谢谢你的链接!它生成的代码并不比上面的代码复杂(15 条指令与 13 条指令),只要你给它选项-mmcu=avr5 -Os
【解决方案2】:

如果您想要快速而肮脏的东西,请将两个 8 位值添加到一个 8 位寄存器中。如果总和小于输入,则使第二个 8 位寄存器等于 1,否则为 0。这就是您可以进行进位的方法。

处理器应该已经有一个叫做进位标志的东西,你可以使用它来达到这个目的。

【讨论】:

    【解决方案3】:

    当我只被教导一次添加两个单个数字时,如何使用铅笔和纸添加两个两位十进制数字? 12 + 49?我可以添加 2+9 = 11 那我该怎么办? (搜索单词carry)

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多