2016-12-05 3 views
0

最近、私はこれらの質問をたくさんお願いしてきたように感じますが、アセンブリはまだ私にとってはかなり外国です。アセンブリ内の配列の8ビット値の16ビットの合計を計算するにはどうすればよいですか?

Arduinoを使用して、配列内の8ビット値の合計を計算し、それを16ビット整数として返すコンピュータ科学クラスの関数をAtmel AVRアセンブリに記述する必要があります。この関数は、バイト配列と引数の長さを表すバイトを引数としてとり、これらの引数は関数が呼び出されたときにそれぞれr24とr22に格納されます。私は分岐命令などを使用することが許可されています。

コードはこの形式になります。

.global sumArray 
sumArray: 
    //magic happens 
    ret 

私はループを作り、カウンターとそのようなことをインクリメントする方法を知っているが、私は本当に私はこれを行うだろうかへと失われています。

私はこれをどうやって行うのかは確信しています。誰もこの機能をAtmel AVRアセンブリに書き込む方法を知っていますか?どんな助けでも大歓迎です!

+1

ヒント: 'ADD'と' ADC'を使用してください。 – Jester

答えて

2

コンパイラに質問してみませんか?これは、最も直接的な解決策ではないかもしれないが、あなたは このコードを勉強している場合、あなたはそれがどのように動作するかを理解することができます

.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 

と、:avr-gcc -std=c99 -mmcu=avr5 -Os -S sum8-16.cしてコンパイル

#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; 
} 

は 次のアセンブリを生成し、うまくいけば、あなた自身のバージョン と来てください。

+0

ああ、ありがとう、私はgodbolt.orgを試していた前に、このソリューションははるかに明確です。どうもありがとうございます! – stealthbomber10

+1

このサイトについて知りませんでした。リンクありがとうございました!あなたがオプション '-mmcu = avr5 -Os'を与えれば、それが生成するコードは上記のものよりも複雑ではありません(15命令vs。13)。 –

0

あなたが何か素早く汚れているように、2つの8ビット値を8ビットレジスタに追加します。合計が入力よりも小さい場合は、2番目の8ビットレジスタを1に、そうでない場合は0にします。これで、キャリーを行うことができます。

プロセッサには、すでにこの目的のために使用できるキャリーフラグと呼ばれるものがあるはずです。

0

鉛筆とペーパー私は一度に2つの一桁の数字を追加するだけで2桁の10進数をどのように追加しますか? 12 + 49?私は2 + 9 = 11を加えて、何をすることができますか? (キャリー語を検索する)

関連する問題