Der beste Weg, um den Wert im Register mit dem AVR der konstanten Montage zu vergleichen

Ich bin neu in der Montage und AVR. Was ist der beste Weg, um zwei Werte wie in C zu vergleichen:

#define SOME_VAL 55
int current_counter = 0;
...
...
if(current_counter==SOME_VAL) {

}

Im Assembler habe ich folgenden Code:

.EQU SOME_VAL = 55

.def current_counter = r19

Wie vergleiche ich den aktuellen Wert am besten mit einer definierten Konstante?

Gibt es einen bestimmten Grund, warum Sie nicht nur C verwenden? avr-gcc ist verdammt gut. Auch eine einfache Antwort auf "Wie mache ich dieses C-Ding in Assembly?" ist, es in C zu schreiben, es zu kompilieren und zu sehen, was generiert wurde.
^^Das Schreiben einer Assembly ohne Grund ist im Jahr 2015 ziemlich albern.
Ich habe letztes Jahr einen Kurs in Mikroprozessoren und Assemblerprogrammierung belegt. Der Rat meines Professors war: "Wenn Sie in Assembler programmieren, tun Sie es nicht!"
@Gregd'Eon, wir hatten einen ähnlichen Spruch in der Klasse I TAed: "Die erste Regel des Programmierens in Assembler lautet: Programmiere nicht in Assembler".

Antworten (1)

Die Anweisung, die Sie benötigen, hat die mnemonische CPI (vergleiche mit sofort).

Dadurch wird je nach Ergebnis ein Flag gesetzt oder gelöscht.

Sie können dann nach Überprüfung des Flags verzweigen.

Sehen Sie sich das folgende Beispiel an. Es stammt aus der [8-Bit] AVR-Anweisungszusammenfassung ( http://www.atmel.com/images/doc0856.pdf ).

Das folgende Beispiel stammt von Seite 24:

Beispiel:

cpi r20,5 ; Compare r20 to the value 5
brbc 1,noteq ; Branch if Zero Flag cleared
...
noteq:nop ; Branch destination (do nothing)

Es gibt andere Anweisungen, die etwas andere Vergleiche durchführen (z. B. zwei Register vergleichen, anstatt ein Register mit einem Literal zu vergleichen).