www.mikrocontroller.net

Forum: Compiler & IDEs Warum Stack Init doppelt?


Autor: Wolf-Ruediger Juergens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolf-Ruediger Juergens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.