Forum: Mikrocontroller und Digitale Elektronik [8051] Segmentdirektiven


von Tom123 (Gast)


Lesenswert?

Hallo zusammen!

"Segmentdirektiven für absolute Segmente" - Das ist das Thema.

Da gibt es ja CSEG, DSEG, XSEG, BSEG, ISEG.

"Mit diesen Direktiven können sogenannte Segmente in den verschiedenen 
Speicherbereichen definiert werden."

Was heißt das bitte genau?

Hier habe ich ein Programm: http://pastebin.com/LX1RvbrF
Ich weis weder was für einen Sinn das Programm hat, also zu was es gut 
ist und so.

Meine Grundkenntnisse: Ich weis wie alle Arethmetsichen, Transportier- 
und JMP-Befehle funktionieren, also an dem solls nicht scheitern.

Es scheitern nur an den Direkektiven die ich wie gesagt gar nicht 
verstehe.

In meinem Programm habe ich alles kommentiert bitte das durchlesen.

XSEG, ISEG und BSEG müsst ihr mir nicht erklären, da es im Programm 
nicht vorkommt, lieber mal das Programm verstehn :).

Ich danke euch im voraus!

Liebe Grüße

Tom

von Bernhard S. (b_spitzer)


Lesenswert?

Der 8051 hat verschiedene Speicherbereiche, die unterschiedlich 
Addressiert werden wollen. In ASM hat man dazu die verschiedenen 
MOV/MOVC/MOVX-Befehle. Beim Anlegen von Texten oder Arrays gibt man dem 
Linker vor, wo die Bereiche angelegt werden sillen, in C flüstert man 
dem Compiler, wo man die Variable gerne hätte.
CSEG Codespeicher, also ROM 0x0000-0xFFFF je nach vornhadenem FLASH
DSEG Datenspeicher internes RAM 0x00-0x7F (den von den Registern und dem 
Stack genutzten Bereich sollte man nicht selber nutzen...)
XSEG Datenspeicher externes RAM 0x0000-0xFFFF je nach vorhandenem XRAM
BSEG Bitadressierbares RAM, Byteadresse 0x20-0x2F, Bitadresse 0x00-0x7F
ISEG indirekt adressierbares internes RAM 0x80-0xFF

zusätzlich gehört dazu noch der SFR-Bereich mit den Byte-Adressen 
0x80-0xFF und den Bitadressen 0x80-0xFF.
Der Zugriff auf eventuell vorhandenens EEPROM geschieht meist, indem das 
EEORM in den XRAM-Bereich eingeblendet wird. Ob dann der Compiler z.B. 
ein ESEG oder ähnliches unterstützt, musst Du bei Bedarf nachlesen.

Bei meinem Compiler (RIDE, RKIT51) heißen die Bereiche CODE, DATA, 
IDATA, XDATA, BDATA, BIT, SFR und SBIT.
Bei aktuellen 8051-Derivaten ist (zur allgemeinen Verwirrung) bereits 
etwas "externes RAM" _im_Chip_(!) enthalten. Damit bleibt normalerweise 
der externe Daten- (P0) und Adressbus (P0+P2) frei für eigene Nutzung. 
Wenn man aber mal aus versehen den vorhandenen Speicherbereich 
überschreitet, dann flackern LEDs an den Ports ganz heftig, weil das 
dann die aktivität auf dem Daten- und Adressbus darstellt.

Bei Deinem Programm wird z.B. der Stack in das indirekt adressierbare 
interne RAM (0x80-0xFF) verlegt, damit der untere RAM-Bereich frei 
nutzbar bleibt. Das macht die Zeile 4: STACK   segment idata
Dabei sucht der Linker dann einen möglichst großen freien Bereich und 
setzt die Variable STACK auf eine Anfangsadresse.

> mov             sp,#STACK-1   ;für was ist das hier gut?
Die Zeile hier setzt dann den Stackpointer SP auf den Anfang des 
gewünschten Bereiches (-1 weil der Pointer auf die zuletzt genutze 
Stelle zeigt).
Die übrigen Zeilen, die Dir nicht klar sind, enthalten nur Anweisungen 
an den Compiler bzw. Linker. Also für einen tieferen Einstieg solltest 
Du mal das Handbuch studieren...

tschuessle
Bernhard

von Tom123 (Gast)


Lesenswert?

Danke dir für deine Mühe!

MAIN  segment code
STACK  segment idata
DATEN  segment data

diese 3 befehle weisen den jeweiligen Namen(MAIN, STACK, DATEN) die 
jeweiligen(code,idata,data) Speicherbereiche zu?

Also das ganze Hauptprogramm wird im Programmspeicher gespeichert, für 
den Stack wird der indirekte interne Datenspeicher zur Verfügung 
gestellt und für
"DATEN"(was meint man damit?) wird der direkte interne Datenspeicher zu 
Verfügung gestellt.

Stimmt das?

Ja aber was ist jetzt "rseg" was bedeutet das?

von Mr Gast (Gast)


Lesenswert?

Ah jetzt verstehe ich.

rseg wählt einen Speicherbereicht aus oder?

rseg  Daten
block:  ds blocksize

Hier z.B. wählt rseg "Daten" aus, also den direkten internen 
Datenspeicher.
Da werden blocksize Bytes reserviert und "block" enthält die 
Anfangsadresse.

Stimmt das?

Eins verstehe ich ncoh nicht.

Der Befehl JMP MAIN, warum findet der genau ins Hauptprogramm, weil man 
davor rseg MAIN macht?

von Bernhard S. (b_spitzer)


Lesenswert?

rseg sollte der Registerbereich 0x00-0x07 (bzw. bis 0x1f mit Banking) 
sein.
Dein verwendeter Compiler scheint auf recht viel Mithilfe angewiesen zu 
sein. Der Assembler von RIDE braucht außer einer org-Direktiven (auch 
nur, wenn das Programm nicht auf 0x0000 beginnt) keine zwingenden 
Compiler/Linkeranweisungen im Quellcode.
Welcher Compiler ist es denn? Hast Du schon mal ein eigenes Projekt "von 
Scratch" erstellt? Gibt es evtl. einen Assistenten, der einen 
Programmrahmen erstellt?

> "DATEN"(was meint man damit?) wird der direkte interne Datenspeicher zu
Verfügung gestellt.
Man kann ja auch in Assembler eigene Datenbeireiche und Variablen 
deklarieren (hier muss dann halt die RAM-Adresse direkt angegeben 
werden).

tschuessle
Bernhard

von tom123 (Gast)


Lesenswert?

Das Programm das ich gepostet habe ist mit uVision4 erstellt worden --> 
Wir verwenden IMMER uvision4.

von Bernhard S. (b_spitzer)


Lesenswert?

Ich kann mir nicht vorstellen, dass KEIL so viel Nachhilfe nötig hat.

Wer hat denn den ASM-Code erstellt? Ein Schüler/Student/Bastler, ein 
Vollzeit-Entwickler oder der Linker....


tschuessle
Bernhard

von Peter D. (peda)


Lesenswert?

"rseg" ist eine Linkerdirektive. Sie sagt, daß der Linker den Code 
verschieben kann (relocate).
Ist bei Assemblerprogrammen nur nötig, wenn sie mit C-Programmen 
zusammen gelinkt werden sollen.
Vermutlich hat sich der Autor ein übersetztes C-Programm als Gerüst 
genommen.

In der Regel schreiben Assemblerprogrammierer einfach drauflos ohne jede 
Segmendirective.
Das Codesegment ist ja default und die paar Variablen kann man auch 
absolut adressieren.


Peter

von tom123 (Gast)


Lesenswert?

Danke!

Den Code haben Schüler mit Hilfe des Lehrers erstellt.

von Dietrich L. (dietrichl)


Lesenswert?

Peter Dannegger schrieb:
> Ist bei Assemblerprogrammen nur nötig, wenn sie mit C-Programmen
> zusammen gelinkt werden sollen.

...oder wenn man mehrere Assemblermodule hat...

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.