如何计算汇编中数组的8位值的16位和?

时间:2016-12-05 15:22:50

标签: arrays assembly arduino sum avr

感觉我最近一直在问很多这些问题大声笑,但对我来说装配仍然很陌生。

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

代码采用以下格式:

.global sumArray
sumArray:
  //magic happens
  ret

我知道如何制作循环并增加计数器和类似的东西,但我真的迷失了我将如何做到这一点。

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

1 个答案:

答案 0 :(得分:2)

为什么不向编译器提问?

#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

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