www.mikrocontroller.net

Forum: Compiler & IDEs Frage zur FAQ


Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.