2016-12-05 4 views
0

Fühlen Sie sich wie ich in letzter Zeit eine Menge dieser Fragen gestellt habe lol, aber die Montage ist mir noch ziemlich fremd.Wie berechne ich die 16-Bit-Summe der 8-Bit-Werte eines Arrays in Assembly?

Mit einem Arduino, muss ich eine Funktion in Atmel AVR Assembly für meine Informatik-Klasse schreiben, die die Summe der 8-Bit-Werte in einem Array berechnet und es als 16-Bit-Ganzzahl zurückgibt. Die Funktion soll ein Array von Bytes und ein Byte aufnehmen, das die Länge des Arrays als Argumente darstellt, wobei diese Argumente in r24 bzw. r22 gespeichert werden, wenn die Funktion aufgerufen wird. Ich darf Verzweigungsanleitungen und dergleichen verwenden.

Der Code ist in diesem Format:

.global sumArray 
sumArray: 
    //magic happens 
    ret 

Ich weiß, wie Schleifen zu machen und den Zähler und ähnliches erhöhen, aber ich bin wirklich verloren, wie ich dies tun würde.

Ich bin unsicher, wie ich das tun würde. Kann jemand diese Funktion in Atmel AVR Assembly schreiben? Jede Hilfe würde sehr geschätzt werden!

+1

Hinweis: Verwenden Sie 'ADD' und' ADC'. – Jester

Antwort

2

Warum stellen Sie Ihrem Compiler nicht die Frage?

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

Kompilieren mit avr-gcc -std=c99 -mmcu=avr5 -Os -S sum8-16.c erzeugt die folgenden Montag:

.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 

dies die nicht geradlinig Lösung sein kann, aber wenn man diesen Code studieren, können Sie verstehen, wie es funktioniert und, Hoffentlich kommen Sie mit Ihre eigene Version.

+0

Ahh ok danke, ich habe godbolt.org schon einmal ausprobiert, diese Lösung ist viel klarer. Ich danke dir sehr! – stealthbomber10

+1

Ich wusste nichts über diese Seite, danke für den Link! Der Code, den er erzeugt, ist nicht komplexer als der obige (15 Anweisungen vs. 13), vorausgesetzt, Sie geben ihm die Optionen -mmcu = avr5 -Os. –

0

Wenn Sie etwas schnell und schmutzig haben möchten, fügen Sie die beiden 8-Bit-Werte in ein 8-Bit-Register ein. Wenn die Summe kleiner als die Eingaben ist, dann mache ein zweites 8-Bit-Register gleich 1, sonst 0. So kannst du den Übertrag ausführen.

Der Prozessor sollte bereits ein sogenanntes Übertrags-Flag haben, das Sie zu diesem Zweck verwenden können.

0

mit Bleistift und Papier Wie füge ich zwei zweistellige Dezimalzahlen hinzu, wenn ich nur zwei einstellige Zahlen gleichzeitig hinzufügen soll? 12 + 49? Ich kann die 2 + 9 = 11 hinzufügen, was mache ich dann? (Suche nach dem Wort carry)

Verwandte Themen