Assembler und .IF und .ELSE

Gast #97319
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
Gast #97320
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren