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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.