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


von Lutz Müller (Gast)


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

von Jörg Wunsch (Gast)


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).

von Lutz Müller (Gast)


Lesenswert?

Besten Dank,

dann weiß ich für die Zukunft Bescheid.

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.