簡體   English   中英

如何計算匯編中數組的8位值的16位和?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM