Forum: Compiler & IDEs Frage zur FAQ


von Martin Raffelsieper (Gast)


Lesenswert?

Hallo zusammen



Das ist die FAQ:

Why does the compiler compile an 8-bit operation that uses bitwise
operators into a 16-bit operation in assembly?

deshalb habe ich mal das hier :

    status_old_2 &= (unsigned char)~status_new;

und dann das hier compilieren lassen:

    status_old_2 &= ~status_new;

beides mal kam der gleiche Code heraus:

     362:  90 91 15 01   lds  r25, 0x0115
     366:  90 95         com  r25
     368:  80 91 16 01   lds  r24, 0x0116
     36c:  89 23         and  r24, r25
     36e:  80 93 16 01   sts  0x0116, r24


wo liegt der unterschied bzw. was will mir die FAQ sagen?


Gruß Martin

von Jörg Wunsch (Gast)


Lesenswert?

Der C-Standard schreibt vor, daß bei Ausdrücken (kurz gesagt) zum Typ
`int' promotet werden muß.  Nun könnte der Compiler bei hinreichend
wenig komplexen Ausdrücken jedoch feststellen, daß am Ende 8 Bits
reichen, um das Ergebnis gleichwertig darzustellen.  Dies scheint bei
Dir der Fall zu sein.  Meist jedoch gelingt es dem Optimizer des GCC
so nicht, dann kann der Typecast helfen.

von Martin Raffelsieper (Gast)


Lesenswert?

Hallo!

Kann denn irgendetwas passieren, wenn denn mal doch nicht auf 8 Bit
optimiert wird? Ich denke da an "nachbar-Variablen", die dann
unverhofft mit umfallen. So was wäre dann schwierig zu debuggen


Gruß Martin

von Marcus M. (Gast)


Lesenswert?

Hallo Martin,

IMHO kann da nichts großes passieren, außer das Du zuviel Speicherplatz
benötigst. Das kann u.U. eine sehr schlimme Folgen haben - µC ist zu
"klein". Ansonsten hat das aber keine Konsequenzen.
Warum sollten denn jetzt Nachbarvariablen in Mitleidenschaft gezogen
werden? Es sei denn, Du bedenkst bei Pointern in Assemblerabschnitten
nicht, das das Ding durchaus auch 16Bit sein kann. So einen Fehler mußt
Du aber von Hand vorbeugen.

Gruß Marcus

PS: Der GCC produziert Assemblercode auf Wunsch. Darin siehst Du, was
wie groß ist und was optimiert worden ist.

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.