Forum: Mikrocontroller und Digitale Elektronik indirektes Speichern


von Timelimelim (Gast)


Angehängte Dateien:

Lesenswert?

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.

von peter dannegger (Gast)


Lesenswert?

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

von Timelimelim (Gast)


Lesenswert?

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.

von Timelimelim (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

"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
Noch kein Account? Hier anmelden.