GNU Assembler Strings vergleichen in .elseif

Gast #4735863
Hallo!

Ich suche gerade nach einer Möglichkeit, Makroargumente zu prüfen.
Ich möchte so etwas nutzen:
1
set_sleep_mode idle    ; Dem AVR das Schlafen beibringen.
2
set_sleep_mode power_down
3
...
Dabei möchte ich dieses Argument mit bestimmten Strings vergleichen, 
etwa so:
1
.macro set_sleep_mode sleep_mode
2
  .if \sleep_mode == "idle"
3
    ldi r16, 1<<SE
4
  .elseif \sleep_mode == "power_down"
5
...
Mit == kann ich anscheinend Zahlen vergleichen, aber keine Strings.
Fehlermeldung:
1
main.S: Assembler messages:
2
main.S:44: Error: Ungültiger Ausdruck
3
main.S:44: Error: junk at end of line, first unrecognized character is `i'
4
main.S:44: Error: Ungültiger Ausdruck
5
...
Die zweite Zeile kann ich durch folgende ersetzen, und das funktioniert 
auch:
1
.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
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.
Gast
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
Gast
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:
1
.macro set_sleep_mode sleep_mode
2
  .ifc \sleep_mode, idle
3
    ldi r16, 1<<SE
4
    .print "Funktioniert!"
5
  .endif
6
  .ifc \sleep_mode, power_down
7
    ldi r16, 51
8
    .print "Funktioniert nicht!"
9
  .endif
10
  ldi r17, 0xd8
11
  sts CCP, r17
12
  out MCUCR, r16
13
.endm
14

15
  set_sleep_mode idle
Mit .ifeqs und "" funktioniert es nicht, jedenfalls nicht, wenn ich es 
ansonsten wie oben schreibe.
1
main.S: Assembler messages:
2
main.S:54: Error: Fehlende Zeichenkette
3
main.S:54: Error: .ifeqs-Syntaxfehler
4
main.S:54: Error: ».endif« ohne ».if«
5
main.S:54: Error: Fehlende Zeichenkette
6
main.S:54: Error: .ifeqs-Syntaxfehler
7
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.