Assembler 8085 Microcontroller

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hi Allz,

ich arbeite mich gerade etwas in assembler ein und bin auch schon direkt auf ein kleines Problem gestoßen:

und zwar, ist mir nicht ganz klar wie man einen STACK realisiert, also ihn erstellt,füllt, abarbeitet usw.

Ein anderes Problem das ich habe: wie kann man denn (wenn überhaupt)eine Adresse, also nicht ihren Wert sondern im Grunde ihren Namen incrementieren (sprich: Adresse heisst 1840h und ich will nun auf 1841h gehen usw).

Falls die Fragen zu blöd sind..bitte nicht übel nehmen..bin ja nur ein newb
:freak:
 
Der Stack("Stapel") ist mal ganz einfach gesagt dein Programm selbst. Das lädst du ja in den (Daten-)Speicher und mit jedem ausgeführten Befehl wird der Stackpointer auf den nächsten Befehl gesetzt. Sofern man daran nicht rumfummelt. Solang du aber keine modulare Programmierung, Sprünge o.ä. an den Tag legst, sollte das erstmal egal sein.

Adressen inkrementieren...pffff...fällt mir erstmal nur indirekte Adressierung ein. Also ein Register R enthält eine Zahl, die eine entsprechende Speicherzelle darstellt.

.
.
MOV @R,A
INC R
.
.

In einer Schleife würde also immer A in die Speicherzelle mit der Nummer in R geschrieben, R selbst dann um eins erhöht.
 
Bitte nicht den Stack Pointer (=Stapelzeiger) mit dem Instruction Pointer (=Programmzeiger) verwechseln.
http://de.wikipedia.org/wiki/Stapelspeicher

Der Stack dient bei Mikroprozessoren + -controllern üblicherweise zur Ablage von Rücksprungadressen nach Unterprogrammaufrufen. Bei den meisten älteren Prozessor-Designs wie dem 8085 gibt es netterweise nur einen Stack (=Stapelspeicher). Auf ihm kann man auch Parameter + Ergebnisse für Unterprogramme und in Interrupt-Routinen gerettete Registerinhalte ablegen.

Der Stack liegt beim 8085 im Speicher für Programme und Daten und wächst von oben nach unten. Keine Ahnung, ob der Stackpointer des 8085 beim Cold Reset auf $FFFF (hier $ für hexadezimal) gesetzt ist. Wenn nicht, muss man in der Reset-Routine einen zum Speicher-Ausbau passenden Wert hineinschreiben.

Wenn es lediglich um die Rücksprungadressen geht, muss man sich um den Stackpointer nicht weiter kümmern. Außer wenn der Stack so groß wird, dass er für andere Zwecke vorgesehenen Speicher überschreibt.
Wenn z.B. gerade eine Rücksprungadresse im RAM bei $FFF1 und $FFF0 abgelegt wurde, hat der Stackpointer anschließend den Inhalt $FFEF, d.h. die nächste Rücksprungadresse würde im RAM bei den Adressen $FFEF und $FFEE abgelegt.

Die Feinheiten rund um die Adressierungsarten sollte man sich ggf. mal mit einem guten Buch 'reinziehen, wobei Übung nicht schaden kann. Ein Buch deshalb, weil das Geld angesichts der anderenfalls draufgehenden nicht unerheblichen Zeit gut investiert ist.
Der 8085 ist nicht unbedingt der beste Prozessor für einen Do-it-youself-Einstieg in den gleichzeitigen Einstieg bei Microcontrollern und Assembler. Die Materialien im Web für die Microcontroller der 8051 - Familien (und deren Verwandten) sind im Web viel häufiger. Selbst 8051-Simulationsprogramme zum Arbeiten mit Assembler sind als Freeware erhältlich.

Firmen wie Atmel haben durch Hinzufügen von Flash-Speicher dafür gesorgt, dass man auch privat zu sehr geringen Kosten Geräte mit Microcontrollern bauen und ggf. die Microcontroller am eigenen PC mit Programmcode versorgen kann.
Inzwischen gibt es aber (auch von ATMEL) modernere Microcontroller-Designs, die bei den Fans wegen deutlich erhöhter Leistungsfähigkeit bei recht niedrigen Preisen beliebt sind.

http://www.mikrocontroller.net/articles/MCS51
http://www.8052.com/
 
Zuletzt bearbeitet von einem Moderator: (Lexikon-Link korrigiert)
Thx schon mal für die schnelle Hilfe.
Ich habe aber noch eine Frage:
man kann ja angeblich beim 8085 jeweils die 8 Bit Register B/C und D/E zu jeweils einem 16Bit Register zusammenschliessen...die Behfehle dazu sind mir auch klar...nur bekomme stets Schwierigkeiten wenn ich dann Operationen auf diesen 16Bit Registern ausführen möchte.

Wenn ich z.B. beide inkrementieren will.
Ich greife nirgends sonst auf diese Register zu aber anscheinend überschneiden sich intern die Register trotzdem, oder ähnliches ...keine Ahnung

btw. ich benutze den ECB Simulator, falls euch das ein Begriff ist
könnte das ein bug im Simulator sein..er hat ja auch einpaar andere wie ich schmerzlich lernen musste

Adios
 
DER Stack wurde von Interlink ja hinreichend beschrieben, wenn Du EINEN Stack erstellen willst, musst Du Dich da ganz alleine selber drum kümmern.

Also: herausfinden - oder sicherstellen - wo im Speicher was frei ist, Adresse speichern, Daten hineinschreiben, Anfangsadresse merken, gespeicherte Adresse erhöhen (oder erniedrigen, wie man es will). Vergleichsroutinen schreiben, ob der Stack voll ist (beliebige Größe würde ich nicht vorschlagen), ob er leer ist, etc.

Das ist ein Stück Arbeit aber lösbar.

Adressen inkrementieren geht nur bei indirekter Adressierung, die Adresse sich also in einem Register befindet.

Z. B. wäre dieses Stück Code denkbar:

Es soll Den Inhalt des Akkus in den Speicher schreiben, die Adresse in HL um 1 erhöhen (also 8 Byte weiterspringen) und die dortigen Daten in den Akku laden.

Code:
STAX  HL   // speichert den Inhalt de Akkus nach M(HL)
INX    HL   // erhöht HL um 1
LDAX  HL  // M(HL) wird in den Akku geladen

HL ist also ein Registerpaar, genau wie BC und DE. Registerpaare (RP) können mit dem Befehl INX RP um 1 erhöht und mit DCX RP um 1 erniedirgt werden. Ich denke mal, das ist Dir bekannt, wenn es nicht funktioniert, dann ist vielleicht ein Umweg nötig. Z. B. so:

Es soll BC erhöht werden.

Code:
INR    C                 // Register C inkrementieren
JNZ    FERTIG        // wenn C nicht 0 zu Adresse FERTIG springen
INR    B                 // Register B inkrementieren

FERTIG: ... hier geht der Code weiter ...

Dekrementierung läuft ähnlich. Soll das als Subroutine implementiert werden müssen gegebenenfalls noch die Register per PUSH PSW und PUSH RP auf dem Stack gesichert werden und am Ende wiederhergestellt werden (POP RP und PUSH PSW, auf umgekehrte Reihenfolge achten!)

Dieses Codestück benötigt im besten Fall 13, im schlechtesten 18 Takte auf dem 8085. Im Gegensatz zu den 6 Takten von INX und DCX bestenfalls also um den Faktor 2 langsamer.

Gruß
Morgoth
 
Das mit dem inkrementieren von Adressen ist ja sogar noch etwa seinfacher als ich dachte.
Wie man nun einen Stack anlegt ist mir zwar noch nicht so 100% klar, aber kommt schon noch..Praxis fehlt halt
:(

Danke an alle für die Hilfe!!!

Greetz Andi
 
Zurück
Oben