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


von Lothar (Gast)


Angehängte Dateien:

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.

von e-tricky (Gast)


Lesenswert?

Geniale Sache, weiter so!

e-tricky

von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Das gleiche nochmal im pdf-Format

von jetmarc (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Peter D. (peda)


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

von mikki merten (Gast)


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.

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.