mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GNU Assembler Strings vergleichen in .elseif


Autor: Tuxpilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich suche gerade nach einer Möglichkeit, Makroargumente zu prüfen.
Ich möchte so etwas nutzen:
set_sleep_mode idle    ; Dem AVR das Schlafen beibringen.
set_sleep_mode power_down
...
Dabei möchte ich dieses Argument mit bestimmten Strings vergleichen, 
etwa so:
.macro set_sleep_mode sleep_mode
  .if \sleep_mode == "idle"
    ldi r16, 1<<SE
  .elseif \sleep_mode == "power_down"
...
Mit == kann ich anscheinend Zahlen vergleichen, aber keine Strings.
Fehlermeldung:
main.S: Assembler messages:
main.S:44: Error: Ungültiger Ausdruck
main.S:44: Error: junk at end of line, first unrecognized character is `i'
main.S:44: Error: Ungültiger Ausdruck
...
Die zweite Zeile kann ich durch folgende ersetzen, und das funktioniert 
auch:
.ifc \sleep_mode, "idle"
Aber mit .elseif kann ich das nicht machen, .elseifc gibt es nicht.
Daher meine Frage: Wie kann ich Strings vergleichen, ohne .ifc?

Vielen Dank für nützliche Antworten!
Tuxpilot

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke das ist eine Assembler Direktive und bewirkt eine bedingte 
Assemblierung, es ist keine if/elif/endiv konstruktion die vom Assembler 
mit cmp/jnz... übersetzt werden kann, Assembler die if/elif/endif 
Assemblieren erlauben natürlich nur Variablen in Wortgrösse.

Autor: Tuxpilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig, das ist bedingte Assemblierung.
Ich möchte eben, je nach angegebenem Argument, eine bestimmte 
Instruktion assemblieren, die zwischen .if und .elseif oder .elseif und 
elseif oder .elseif und endif steht.
Meine Frage betrifft ja auch den „Bedingungsteil“ der .if-Direktive

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Link zur Beschreibung:
https://www.sourceware.org/binutils/docs-2.12/as.i...
ifequ vergleicht zwei Strings, oder?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Tuxpilot schrieb:

Doku zu .ifc sagt: unquoted oder single quoted, bei "" passt .ifeqs
.ifeqs \sleep_mode, "blah"
.endif
.ifeqs \sleep_mode, "blubb"
.endif
.ifeqs \sleep_mode, "blaeh"
.endif
...

Autor: Tuxpilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Doku zu .ifc sagt: unquoted oder single quoted, bei "" passt .ifeqs

Du hast recht, .ifc mit "" brachte nur keine Fehlermeldung.
Das hier funktioniert:
.macro set_sleep_mode sleep_mode
  .ifc \sleep_mode, idle
    ldi r16, 1<<SE
    .print "Funktioniert!"
  .endif
  .ifc \sleep_mode, power_down
    ldi r16, 51
    .print "Funktioniert nicht!"
  .endif
  ldi r17, 0xd8
  sts CCP, r17
  out MCUCR, r16
.endm

  set_sleep_mode idle
Mit .ifeqs und "" funktioniert es nicht, jedenfalls nicht, wenn ich es 
ansonsten wie oben schreibe.
main.S: Assembler messages:
main.S:54: Error: Fehlende Zeichenkette
main.S:54: Error: .ifeqs-Syntaxfehler
main.S:54: Error: ».endif« ohne ».if«
main.S:54: Error: Fehlende Zeichenkette
main.S:54: Error: .ifeqs-Syntaxfehler
main.S:54: Error: ».endif« ohne ».if«
Das half mir schon mal weiter. Danke, Johann!

Kann man diese Spezial-.ifs echt nicht mit .elseif kombinieren?
Mit .ifc .endif .ifc .endif ... ist natürlich nur eine Bedingung wahr, 
aber mehr zu schreiben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.