Warum Stack Init doppelt?

Gast #77938
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
Gast #77939
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.
#77940
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
Gast #77941
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.
Gast #77942
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren