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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.