Forum: Compiler & IDEs avrgcc warning: asm operand 0 probably doesn't match constr


von Christian (Gast)


Lesenswert?

Hallo,
ich hab' ldier schon wieder ein Problem mit avrgcc.
Von Assembler her bin ich gewohnt, dass man in variablen oder registern 
einzelne Bits löschen oser setzen kann - das ist in manchen Fällen 
meiner Meinung nach wesentlich praktischer und einfacher als die 
zahllosen Bitoperationen von C (>>, |, &.....)
Also hab' ich mal munter "cbi (byte, 4);" hingeschrieben - es gibt zwar 
keinen Fehler, aber die Warnmeldung - wie kann ich das verhindern oder 
wie löst man sowas elegant???

Vielen lieben Dank!!!

Christian

von Schmittchen (Gast)


Lesenswert?

Das geht doch nur mit vorgesehenen IO-Registern. Auf eine Variable 
kannst du ein "cbi" nicht anwenden.

Lösung:
byte = byte & ~0x10;
oder
byte &=~0x10;

Bin mir jetzt mit der cbi-Syntax nicht ganz sicher, aber cbi(byte,4) 
sollte doch Bit 4 löschen (bei 0 beginnend zu zählen).

Zieh dir die "zahllosen Bitoperationen" mal rein, das is garnicht so 
schwer.

Anmerkung: Wenn du in der Variablen byte zufälligerweise eine gültige 
Adresse eines IO-Registers stehen gehabt hättest, dann  hättest du den 
Inhalt dieses Registers verändert... böse Sache - "nie" zu finden.

Schmittchen.

von Christian (Gast)


Lesenswert?

Hallo Schmittchen,
Danke für deine Antwort.

Meinst du mir deiner Anmerkung, dass man das DDRx register löschen kann 
und dann das Byte ins PORT Register reinladen kann und dort 
manipulieren???

Vielen Dank

Christian

von Schmittchen (Gast)


Lesenswert?

Zunächst: Ich habe soeben mal wieder einen Beitrag verfaßt und auf 
submit geklickt. Leider war das Subject zu lang (>60Zeichen). Das gibt 
eine Warnmeldung mit der Aufforderung das bitte zu beheben. Aufmerksam 
hab ich darüber nachgedacht wie ich wieder zurückkomme ohne meinen Text 
zu löschen. (Wär' ja nicht der erste Beitrag, den ich mir wegschieße). 
Ich entschied mich auf "Zurück-zum-Betrag" zu klicken. Alles weg. :-(
@Andreas: Gibts da keine bessere Möglichkeit solche "Bedienfehler" zu 
verhindern? (Der Browser-back-button hätte meinen Beitrag nicht zerstört 
- hoffentlich kann ich mir das jetzt merken).

Zum Thema:
Ich dachte zunächst daran, dass deine Variable "byte" z.B. den Wert 
0x11 annehmen könnte. Wenn du dann mittels "cbi (byte,4)" eine 
Bitänderung erzwingen willst, dann würde das nicht auf die Variable 
"byte" passieren, sondern das Register mit der Adresse 0x11 betreffen 
(in diesem Falle das DDRB-Register). Dadurch würde Pin4 auf Eingang 
geschaltet. Das kann zu seltsamen und unerwarteten Fehlern/Effekten 
führen, deshalb:
> böse Sache - "nie" zu finden.

ABER: So wie ich mir das jetzt gedacht habe ist das nicht! Der 
Compiler muß ja zur Übersetzungszeit schon aus der Anweisung "cbi" und 
deiner Variablen "byte" einen Assemblerbefehl generieren. Die Adresse 
bzw. das IO-Register auf das das Kommando angewendet wird, fließt mit in 
den Opcode ein. Dazu muß sich der Compiler für einen Wert für "byte" 
entscheiden. Die Wahl fällt auf 0 - wie er auch später als 
Compilerwarnmeldung ausgibt. Es passiert also nichts. Du kannst dir dein 
cbi-Kommando also sparen - Bit 6 würde so jedenfalls nicht gelöscht.

Schmittchen "der seine Gedankengänge, trotz Verwirrungsgefahr, stehen 
läßt"

von Christian (Gast)


Lesenswert?

Hallo Schmittchen,
vielen Dank für deine ausführlich Antwort (die du vermtulich 2 mal 
schreiben mussetst). Ich hatte bei meinem 2. Posting auch das Problem, 
dass alles weg war - aus diesem Grund hab' ich mich beim 2. Anlauf auf 
eine kürzere Variante meiner Antwort beschränkt....

Deine Erklärung leuchtet mir ein - vielen Dank!!!!

mfg

Christian

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Der Bug mit dem zu langen Subject ist schon behoben, es wurde 
versehentlich ein Zeichen zu wenig abgeschnitten. Wenn du auf "Zurück" 
klickst sollte der Beitrag eigentlich nicht verschwinden, bei mir bleibt 
er!

Gruß
Andreas

von Christian (Gast)


Lesenswert?

Hallo Andreas,

vielen Dank für die Bug Behebung!!!
Das mit dem "zurück" hat bei mir auch erst einmal nicht funktioniert - 
keine Ahnung was ich da anderst gemacht habe???

mfg

Christian

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.