Der STACK Teil 2 - Parameterübergabe an Unterprogramme

Gast #7861
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.
Angehängte Dateien:
Gast #7864
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.
#7866
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
Gast #7867
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

Eine eigene Frage? Dieser Thread ist über 24 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.