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


von Tuxpilot (Gast)


Lesenswert?

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

von Heinz V. (heinz_v)


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.

von Tuxpilot (Gast)


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

von Heinz V. (heinz_v)


Lesenswert?

Link zur Beschreibung:
https://www.sourceware.org/binutils/docs-2.12/as.info/If.html#If
ifequ vergleicht zwei Strings, oder?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Tuxpilot schrieb:

Doku zu .ifc sagt: unquoted oder single quoted, bei "" passt .ifeqs
1
.ifeqs \sleep_mode, "blah"
2
.endif
3
.ifeqs \sleep_mode, "blubb"
4
.endif
5
.ifeqs \sleep_mode, "blaeh"
6
.endif
7
...

von Tuxpilot (Gast)


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:
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.

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.