[英]How do I compute the 16-bit dot product of two arrays containing 8-bit values?
[英]How do I compute the 16-bit sum of the 8-bit values of an array in assembly?
感覺最近我一直在問很多這樣的問題,但是匯編對我來說仍然很陌生。
使用Arduino,我必須為我的計算機科學類在Atmel AVR Assembly中編寫一個函數,該函數計算數組中8位值的總和並將其作為16位整數返回。 該函數假定將字節數組和代表數組長度的字節作為參數,調用函數時,這些參數分別存儲在r24和r22中。 我被允許使用分支指令等。
代碼采用以下格式:
.global sumArray
sumArray:
//magic happens
ret
我知道如何進行循環和增加計數器等操作,但是我真的迷失了如何執行此操作。
我不確定該怎么做。 有誰知道如何在Atmel AVR Assembly中編寫此功能? 任何幫助將非常感激!
您為什么不向編譯器提問呢?
#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
這可能不是最直接的解決方案,但是如果您學習此代碼,則可以了解其工作原理,並希望附帶自己的版本。
如果您想要快速又臟的東西,請將兩個8位值添加到8位寄存器中。 如果總和小於輸入,則使第二個8位寄存器等於1,否則等於0。這就是進行進位的方法。
處理器應該已經有一個稱為進位標志的東西,可以用於此目的。
使用鉛筆和紙時,僅教我一次添加兩個單位數字時,如何添加兩個兩位數字的十進制數字? 12 + 49? 我可以加2 + 9 = 11,那我該怎么辦? (搜索“進位”一詞)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.