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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.