mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik indirektes Speichern


Autor: Timelimelim (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timelimelim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timelimelim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.