感觉我最近一直在问很多这些问题大声笑,但对我来说装配仍然很陌生。
使用Arduino,我必须在Atmel AVR Assembly中为我的计算机科学类编写一个函数,该类计算数组中8位值的总和并将其作为16位整数返回。该函数应该接受一个字节数组和一个表示数组长度的字节作为参数,当调用该函数时,这些参数分别存储在r24和r22中。我被允许使用分支指令等。
代码采用以下格式:
.global sumArray
sumArray:
//magic happens
ret
我知道如何制作循环并增加计数器和类似的东西,但我真的迷失了我将如何做到这一点。
我不确定如何做到这一点。有谁知道如何在Atmel AVR Assembly中编写此函数?任何帮助将不胜感激!
答案 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
这可能不是最直接的解决方案,但如果你学习 这段代码,你可以理解它是如何工作的,并且希望随之而来 你自己的版本。