www.mikrocontroller.net

Forum: Projekte & Code Der STACK Teil 2 - Parameterübergabe an Unterprogramme


Autor: Lothar (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Neulingen und Seiteneinsteiger verfügen oft nicht über
hinreichendes Grundlagenwissen. Im Netz ist das, bei der
Fülle an Informationen, schwer zu finden. Und gute Bücher
für Schüler oft schlicht zu teuer.

Hier würde ich gerne etwas helfen. Schöner wäre es, wenn
es ein Forum "Grundlagen" gäbe. Trotzdem probiere ich es
mal testweise in diesem.

Mein erster Beitrag besteht aus drei Teilen zum Thema STACK.
Andere Themen sind in Vorbereitung und würden bei positivem
Echo folgen. Zahlentheorien und -systeme, Mathematik mit µP,
strukturierte Programmierung u.s.w.

Ich bitte hierzu um Feedback. Allgemein in's Forum, speziell
bitte direkt.

Autor: e-tricky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geniale Sache, weiter so!

e-tricky

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das gleiche nochmal im pdf-Format

Autor: jetmarc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh Gott...

Vorher - Hauptebene       2 Zyklen + RCALL
         Unterfunktion    1 Zyklus + RET

Nachher- Hauptebene      10 Zyklen + RCALL
         Unterfunktion   25 Zyklen + RET

Tolle Verbesserung.  Wollen wir Speicherverbrauch auch mal
nachrechnen?

Der IAR Compiler zum Beispiel nutzt die Register R16-R23
zur Parameteruebergabe.  Solange die ausreichen, wird der
Stack nicht angeruehrt.  So kann zB eine Funktion

  short TestFunc(short val1, void *buf, char ch1, char ch2);

komplett in den Registern ablaufen.  Da der Stack bei mehr
als 8*8bit doch noch hinzugezogen wird, hast Du effektiv
keine Einschraenkungen.  Alle Funktionen sind genauso
universell wie bei Deinem Vorschlag.  Nur halt viel schneller
und kuerzer.


Marc

PS: Das SPL Register liest man mit IN, nicht mit MOV.  Zudem
    musst Du Deine Funktion nochmal laenger machen, wenn Du
    SPH auch noch liest.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na hallo, sei mal nicht so streng, das war doch nur eine Demonstration 
wie man's macht wenn man's machen muss. Ich musste es nebenbei bemerkt 
noch nie machen, für richtig dicke Programme wo man sowas vielleicht 
brauchen würde nehm ich C.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da muß ich Marc zustimmen.

Die Stackmethode macht nur Sinn bei reentranten Funktionen und die sind 
eh nur was für den C-Freak.

Ich benutze auch die Register z.B. für Multiplikation und Division.
Addition, Subtraktion und Vergleich macht man ja eh direkt, die sind zu 
kurz, um da eine extra Unterfunktion aufzurufen.

Allerdings nehme ich nicht direkt Register, sondern weise entsprechende 
Namen zu. Z.B. die 32-Bit Division benötigt A3..A0 (Divident, Quotient), 
B3..B0 (Divisor, Rest), I0 (Schleifenzähler) und T3..T0 
(Zwischenspeicher).
Und die weist man dann irgendwelchen Registern zu.

Assembler ist eh nur was für kleine Programme. d.h. man kann 
überblicken, welche Funktion welche Register verwendet.


Peter

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die AVR Prozessor-Familie ist etwas unglücklich als
Demonstration für eine Parameterübergabe via STACK
gewählt. Auch hat man diesen Aspekt beim Entwurf dieser Familie wohl 
nicht im Sinn gehabt, zumal der Stack-Pointer im I/O Bereich angesiedelt 
ist. Dieser kann daher nicht direkt geändert werden.

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.