Forum: Compiler & IDEs Warum Stack Init doppelt?


von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Hallo,
Mir ist aufgefallen daß der Stack beim AVR-GCC 2x initialiert wird:

Einmal hier in der runtime:

00000026 <__ctors_end>:
  26:  11 24         eor  r1, r1
  28:  1f be         out  0x3f, r1  ; 63
  2a:  cf e5         ldi  r28, 0x5F  ; 95
  2c:  d4 e0         ldi  r29, 0x04  ; 4
  2e:  de bf         out  0x3e, r29  ; 62
  30:  cd bf         out  0x3d, r28  ; 61
....
und dann noch mal in der main:
void main(void)
{
  5c:  cf e5         ldi  r28, 0x5F  ; 95
  5e:  d4 e0         ldi  r29, 0x04  ; 4
  60:  de bf         out  0x3e, r29  ; 62
  62:  cd bf         out  0x3d, r28  ; 61
....

Hat das einen bestimmten Grund oder ist das ein Bug?

Wolf

von Jörg Wunsch (Gast)


Lesenswert?

Hysterische Gründe.

Ursprünglich wurde es nur an einer Stelle gemacht (ich weiß gar nicht
genau aus dem Hut, welches von beiden), die andere kam später.
Eigentlich war die Intention, das komplett abzulösen.  Da aber avr-gcc
und avr-libc von unterschiedlichen Leuten gepflegt werden (die
Releases also nicht gleichzeitig sind), braucht man für so eine
Ablösung einen gewissen zeitlichen Übergang, und nun, vermutlich ist
die Angelegenheit in Vergessenheit geraten.

von Peter D. (peda)


Lesenswert?

Die richtige Stelle dürfte im Startup-Code sein, z.B. der Keil macht das
so.

Es ist zwar nicht die feine englische Art, aber man kann durchaus auch
das main() wie jede andere Funktion rekursiv aufrufen.
Und dann dürfte es mächtig in die Hose gehen, wenn dort der Stack neu
gesetzt wird.


Peter

von Jörg Wunsch (Gast)


Lesenswert?

Das dürfte dann wohl auch der Grund gewesen sein, es aus main() heraus
zu verlagern, ja.  Anfänglich war nur die C-Startup-Infrastruktur noch
nicht so weit entwickelt, daß man das dort schon hineinpacken konnte.

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Danke für die Aufklärung, allerdings kann ich mir keinen Grund
vorstellen die main rekursiv aufzurufen...
Wenn ich die 8 bytes mal brauche dann werde ich sie aus dem Source der
AVR-LIBC entfernen ;-)

Schöne Ostern
Wolf

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.