Hi Leute! Bei dem Versuch eine möglichst gut wiederverwertbare Unterroutine zu schreiben bin ich auf ein kleines Problem gestoßen. Der betreffende Auszug aus dem Quellcode ist im Dateianhang zu finden. Der Funktion binbcd wird eine Binärzahl übergeben und 2 dezimalstellen sollen als Rückgabewert zum Schluss auf dem Stack liegen. Da es 2 Rückgabewerte sind, lege ich einfach 2 mal den Parameter auf den Stack um Platz zu schaffen. Nach der Bestimmung der 2 Ziffern sollen nun an diese Stelle mit Hilfe der Befehle ST Z, r16 und ST -Z, r17 die Werte geschrieben werden. Doch immer wenn ich die Zeile mit dem -Z stehen lasse, findet das Programm von binbcd nicht mehr zurück zu time_display. Ich dachte ich würde mit Z an die Stelle des 1. Parameters und mit -Z an die Stelle des 2. Parameters im Speicher schreiben. Sieht einer von euch den Fehler? Wäre super, wenn ihr mir helfen könntet.
Die Parameterübergabe aufm Stack ist sehr gefährlich. Man muß höllisch aufpassen, daß der Stack ausbalanziert ist. Bei Architekturen mit Registern (8051, AVR) sollte man immer die Register bevorzugen. Wenn man zuviel oder zuwenig Register ausliest oder übergibt, ist höchstens das Ergebnis falsch. Ein unbalanzierter Stack ist aber wie ein Atomsprengkopf. Und er explodiert nicht gleich, sondern erst an ganz anderer Stelle. 2 Monate Debuggen für einen Stackfehler ist nichts ungewöhnliches. Peter
mmmh.....das klingt ja wirklich aufbauend! Aber da ich ja nur an kleinen Assembler Programmen sitzte werden mir solche Katastrophen wohl eher erspart bleiben. Außerdem ist die Wiederverwertbarkeit von stacknutzenden Funktionen doch viel einfacher. Wenn man einmal ein wenig Grips investiert hat, klappt es eigentlich ganz gut. So ist zumindestens meine Erfahrung bei kleinen Aufgaben.
Ok, ich hab meinen Fehler selbst gefunden. Bei dem Aufruf von binbcd wird der Stackpointer um 2 erniedrigt. Stimmt, jetzt fällt es mir wie Schuppen von den Augen: Die Rücksprungadresse ist ein wenig größer als 8bit.... ärger Man muss manchmal nur drüber reden g
"Außerdem ist die Wiederverwertbarkeit von stacknutzenden Funktionen doch viel einfacher." Finde ich überhaupt nicht, sondern das ganze Gegenteil. Was hast Du gegen Register ? Die sind doch zum Benutzen gedacht und außerdem wird dadurch der Code kleiner, schneller und übersichtlicher, wenn man sich die ganzen PUSH/POP Orgien spart. Der Trick ist, sich die Register einmal einzuteilen. Peter
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.