"Sobald Unterprogramme etwas verschachtelt sind, kannst Du nur so
Übersicht bewahren"
Da ist überhaupt kein Unterschied !
Egal ob Stack oder Register, man muß sich erstmal einige Konventionen
überlegen und diese dann einhalten.
Z.B. definiere ich mir Register A3..A0,B3..B0,T3..T0,I1,I0.
A,B sind dann für die Operanden und Rückgabewerte, T,I für temporäre
Variablen und Scheifenzähler.
Schau Dir einfach mal einige Beispiele von mir in der Codesammlung an.
Ich gebe zu, das ist nicht auf meinem Mist gewachsen, ich habs mir
einfach von C-Compilern abgeguckt.
Als ich angefangen habe, habe ich auch wie wild gepusht und gepopt, bis
ich schließlich die Übersicht verloren hatte.
Und dann die vielen Fälle, wo ich mir nen Wolf gesucht habe, nur weil
irgendwo andersrum gepopt als gepusht wurde:
push r16
push r17
push r18
push r19
; mache was
pop r19
pop r17
pop r18
pop r16
Register sind dazu da, um sie zu benutzen und nicht ständig zu pushen.
Natürlich kann man sich einige Register für sehr häufige globale
Variablen freihalten, aber deshalb hat man ja auch 32 Stück.
Und auch für Interrupts reserviert man ein paar Register.
Z.B. hat man ja 3 Pointer (X,Y,Z), benötigt aber höchstens 2
gleichzeitig. Also ist es eine gute Idee, X nur für Interrupts zu
reservieren. Und da Interrupt fast immer das SREG zerstören, kann man
R2 fest für das Sichern des SREG reservieren.
"Rekursionen gehen ohnehin nicht anders"
Rekursionen sollte man als Anfänger meiden, wie der Teufel das
Weihwasser. Typisch für Rekursionen ist nämlich, daß sie bei
ungünstigen Startwerten sehr gerne zum Stacküberlauf führen.
Nur erfahrene Programmierer können da die Übersicht behalten (aber die
benutzen in der Regel C).
Für den Anfänger sind Schleifen statt Rekursionen wesentlich
übersichtlicher, schneller und vor allem sicherer.
Peter