Forum: Mikrocontroller und Digitale Elektronik Assembler und .IF und .ELSE


von Joern (Gast)


Lesenswert?

Wer von euch kann mit dem Atmel Assembler Studio4 und den neuen
directiven arbeiten?
Ich suche Code-Beispiele mit .IF und .ELSE.
Kann ich diese Direktiven so einsetzen wie in Basic?
Aus den Hilfen von Atmel werde ich nicht schlau. Einige Beispiele wären
hilfreich.
Vielen Dank

von Christof Krüger (Gast)


Lesenswert?

.if, .ifdef etc. sind Compiler-Direktiven, werden also zu Compilierzeit
ausgewertet. Du kannst damit also nichts zur Laufzeit auswerten, sowas
wie

if (PINA = 0) then ....

ist also nicht möglich, da dies ja erst beim Ausführen (Runtime)
entscheidbar ist.

Das ganze nennt sich also bedingte Compilierung. Du kannst z.B. damit
leicht ganze Codeabschnitte auskommentieren oder bestimmte
Codevarianten leicht testen und umschalten:

.equ Variante = 1

[...]

.IF Variante == 1
 [Code für Variante1...]
.ELIF Variante == 2
 [Code für Variante2...]
.ELIF Variante == 3
 [Code für Variante3...]
.ENDIF


Stell dir jetzt vor, du möchtest jetzt doch eine andere Variante
testen. Statt umständlich den Code umzubasteln und auszukommentieren
setzt du oben bei .equ einfach den Wert anders und der Assembler
kompiliert dir was anderes herein. Der Code der anderen Varianten ist
dann nachher überhaupt nicht mit im Hex-file, ist also so, als wäre es
auskommentiert.
In Verbindung mit Macro's lässt sich das auch schön einsetzen. Hier
mal ein Beispiel:

Example:
.MACRO SWAPMEM
.IF @4 == 1
        push @2
        push @3
.ENDIF
        ld @2, @0
        ld @3, @1
        st @0, @3
        st @1, @2
.IF @4 == 1
        pop @3
        pop @2
.ENDIF
.ENDMACRO

.CSEG
        SWAPMEM R1, R2, R16, R17, 1

Hier wird der Inhalt der Speicherzellen vertauscht, auf die die
Register R1 und R2 zeigen. Wenn man das öfter im Code macht, kann man
für sowas mal ein Macro schreiben. Das Beispielmakro braucht 2
Hilfsregister, die als dritter bzw. vierter Parameter übergeben werden.
Als 5ter Parameter soll eine 1 stehen, wenn der Inhalt der Hilfsregister
durch den Macro-"Aufruf" nicht verändert werden soll.
Der Assembler prüft also zur Kompilierzeit ob die Register gesichert
werden sollen und führt entsprechende PUSHs und POPs aus.
Somit hält man den Code übersichtlich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.