Forum: Compiler & IDEs Offsetangabe im SRAM


von Boris (Gast)


Lesenswert?

Hallo miteinander,
unter Assembler gibt es die Möglichkeit mittels ".org 0x0400" Daten
im Programmspeicher an einer bestimmten Stelle zu plazieren.
Wie kann ich dies im SRAM realieren?
Ein Zeiger soll ein Datenfeld durchlaufen. Wenn dieses Feld z.B. an der
o.g. Adresse beginnt ist der Zeiger leichter zu initalisieren und kann
ganze 255 Daten mit einem Byte ansprechen.
Danke!
Gruß Boris

von eugen D (Gast)


Lesenswert?

na du deklarierst dir nen pointer in den du die ardresse lädst und dann
auf die stelle speicherst auf die der pointer zeigt. aba das würd ich
lieber dem compiler überlassen (mit ne datenfeld )
mfg eugen

von Michael (Gast)


Lesenswert?

"aba das würd ich
lieber dem compiler überlassen"

Wieso denn das? Bei vielen Sachen unpraktisch und erzeugt unnötigen
Overhead.

von eugen D (Gast)


Lesenswert?

ich dachte an ein globales datenfeld
mfg eugen

von Martin Weber (Gast)


Lesenswert?

Hallo Boris!

Dein Problem läßt sich glaub' ich ganz einfach lösen:

Es gibt ja in Assembler Compilerdirektiven, die angeben, in welchen
Speicher der Code geschrieben werden soll.
".CSEG" signalisiert, daß es sich um Programmcode handelt
".DSEG" , daß es sich um Daten für das SRAM handelt und
".ESEG" , daß es sich um Daten für das EEProm handelt.

".ORG" legt eine absolute Speicheradresse fest, in die die Daten
geschrieben werden sollen. ".ORG" kann beliebig oft, an beliebiger
Stelle und in jedem Speicherbereich angewandt werden.

.DSEG
.ORG 0x0400
Daten1...
.ORG 0x0500
Daten2...
.CSEG
.ORG 0x0000
Programcode...

Legt also fest, daß die Daten1 ab 0x0400 im SRAM plaziert werden, und
die Daten2 ab 0x0500 im SRAM. Der Programmcode wird ab Adresse 0x0000
des Codespeichers plaziert. Die ".ORG"-Adresse im ".DSEG" bezieht
sich dann natürlich auf den Speicherbereich des SRAM und die
".ORG"-Adresse im ".CSEG" auf den Programmspeicher!
Man sollte nur darauf achten, daß sich mehrere ".ORG" nicht ungewollt
überlappen.
Ich weis jetzt allerdings nicht, ob der Compiler bei einem Wechsel
zwischen den einzelnen Speicherbereichen sich die jeweiligen
".ORG"-Positionen merkt. Wenn man sichergehen will, dann lieber bei
einem Bereichswechsel (also z.B. nach einem ".DSEG" ein ".CSEG")
mit einem ".ORG" beginnen. Evtl. mal in einer Anleitung des Compilers
nachforschen.

Grüße, Martin.

von Matthias (Gast)


Lesenswert?

Hi

und wie sollen die Daten im SRAM landen? Das SRAM kann man nur zur
Laufzeit beschreiben. Wenn da bestimmte Daten liegen sollen muß man
diese beim Programmstart aus dem Flash oder dem EEPROM dorthin
buxieren. Und diese Arbeit wird einem vom Assembler nicht abgenommen.

Matthias

von Jörg Wunsch (Gast)


Lesenswert?

Außerdem sind wir hier im GCC-Forum, und für den GNU assembler gibt's
weder .cseg/.dseg/.eseg (heißt dort anders, insgesamt flexibler) noch
ist es für verschiebliche Objektmodule in irgendeiner Form sinnvoll,
.org zu benutzen, da die endgültige Lage der Objekte erst vom Linker
festgelegt wird.  Folglich muß man Linkerdirektiven bemühen, wenn man
irgendwas auf irgendwelche festen Adressen binden will.

.org ist ein Relikt aus der Zeit der Absolutassembler.  Mit
Absolutassemblierung hat man aber eigentlich selbst unter CP/M auf dem
Z80 bereits nicht mehr gearbeitet...

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.