www.mikrocontroller.net

Forum: Compiler & IDEs Frage Übersetzung C => Assembler


Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

leider bin ich immer noch arg am Anfang mit C. Drum schreib ich einfach
die simpelsten Programme und simuliere im Studio 4.10 hin und her. Nun
ist folgendes passiert:

void delay (int a) {
  for (int b=0; b<a; b++) {
  };
}

und

delay (2);

wird übersetzt zu
          for (int b=0; b<a; b++) {
CP      R1,R24      Compare
CPC     R1,R25      Compare with carry
BRGE    PC+0x03     Branch if greater or equal, signed
          for (int b=0; b<a; b++) {
SBIW    R24,0x01         Subtract immediate from word
BRNE    PC-0x01          Branch if not equal
RET                      Subroutine return

und

          delay (2);
LDI     R24,0x02         Load immediate
LDI     R25,0x00         Load immediate
RCALL   PC-0x0014        Relative call subroutine

Wenn ich mir im Watch-Fenster die Variablen a und b anschaue, sind
BEIDE Werte im ersten Durchlauf 2, im zweiten Durchlauf BEIDE 1 und
dann wird mit RET wieder zurückgekehrt. Wie auch im Disassembler zu
sehen, löst er die Zählung mit Minus statt mit Plus. Im Prinzip macht
das Programm ja, was es soll (nämlich 2 mal nix und dann zurück), aber
wenn ich später mal "richtig" debuggen will und die Variablen immer
andere werte haben als intuitiv erwartet (wer weiß, was für
Optimierungen da noch so gehen), wird´s nicht so hilfreich sein, den
aktuellen Wert einer Variablen anzuschauen.

Oder hab ich was falsch im Compiler eingestellt, was ich gaaanz schnell
wieder ändern sollte?

Danke und Gruß

Lutz

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist völlig normal, daß der Compiler bei der Optimierung Deinen Code
umstellt.  In diesem Falle gibt es einfach keine Variablen b und a
mehr im originalen Sinne, folglich kannst Du sie auch nicht anzeigen
lassen.  Stattdessen hat der Compiler letztlich daraus

while (--b > 0) ;

daraus gemacht.

Gewöhn' Dich am einfachsten daran, trau lieber dem erzeugten
Assemblercode (besser übrigens der direkten Ausgabe des Compilers als
einem Disassembler, gerader der Disassembler vom AVR Studio hat
durchaus auch paar Macken).  Du könntest zwar die Optimierung auch
abschalten, aber dann debuggst Du einen komplett anderen Code (mit
völlig anderen Fehlern).

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank,

dann weiß ich für die Zukunft Bescheid.

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.