GNU Assembler Strings vergleichen in .elseif

Gast #4735863
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
Gast #4735886
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
Gast #4735923
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.

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