PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brett vorm Kopf :-( Overlay



Richard
03.12.2010, 17:58
Moin moin allerseits.

Warum auch immer, ich begreife nicht was es mit dem Overlay Befehl auf sich hat weil ich irgendwie nicht raffe was dort (genau) passiert?

Das dort je nach Variablentyp mehr oder weniger viele Speicherstellen vom Compiler reserviert werden, kann ich mir vorstellen. Das macht aber jeder Comliler wenn Variablen als byte, word, dwort oder long definiert werden.

Vorstellen könnt ich mir das beim Zugriff auf eine z,B Wort Variable x mittels Index x(i) auf ein bestimmtes BIt/Byte innerhalb der Variable zugegriffen werden kann (was Sinn machen kann). Nur (wahrscheinlich rauche ich zu viel) Mentol und bekomme Alzheimer?

Gruß Richard

Ps.; ab einfachste werde ich es wahrscheinlich in "Pseudo Assemler" raffen.

Vitis
03.12.2010, 18:07
Per Overlay werden Speicherstellen übereinander gelegt und zwar die ganzen Bytes.

Beispiel:

Dim word_variable as word
dim low_byte as byte at word_variable overlay
dim high_byte as byte at word_variable+1 overlay

So hast Du direkt Zugriff auf die zwei Bytes aus denen sich das Word
zusammensetzt ohne shiften oder typkonvertierung etc.

PicNick
03.12.2010, 18:39
Bascom (und jeder andere Compiler) hat einen Adress-Pointer, wo die nächste Variable hingestellt wird.
Bei DIM wird dem String "varablenname" diese pointer zugeordnet.
dann wird der Adress-Pointer um die Länge der Variablen erhöht.
Durch die Angabe "OVERLAY AT andere-variable" wird dieser Pointer auf den wert von "andere-variable" gesetzt.
dadurch haben "Variablenname" und "andere-Variable" die gleiche Speicheradresse.
sonst passiert eigentlich nix. es steckt aber eine Menge drin, wie du als assemblianer dir ja vorstellen kannst.

http://www.rn-wissen.de/index.php/Bascom_Speicherstrukturen

guenter1604
27.12.2010, 18:41
Da du noch nicht Ahaaa!! gesagt hat, ein weiterer Erklärungsversuch:

Jede Variable hat ja ihren bestimmten "Platz", dieser Platz hat eine eindeutige "Hausnummer" sinnigerweise auch Adresse genannt.
Je nach Größe der Variable kann diese einen ganzen Straßenzug belegen.
Ein Overlay beinhaltet nun EINE Hausnummer und zwar die, bei der begonnen werden soll. Durch die Festlegung der Größe des Overlays (as Byte, as Word usw.) sage ich dem Overlay wieviel Hausnummern ich ab der Starthausnummer haben will. Durch das AT, dort sage ich wo begonnen werden soll.
Beispiel:

4 Wordvariablen sollen Byteweise übertragen werden.
Deshalb wird ein Array aus Bytes erzeugt.
Die Wordvariablen existieren garnicht, die Daten werden an den gewünschten Stellen ins Array geschrieben.
Speed_left = 1 und 2
At Data_array(1) sagt: starte im Array an Position 1
Dim Speed_left As Word sagt nur 2 Bytes lang!

Speed_right = 3 und 4
usw.


Dim Data_array(10) As Byte
Dim Speed_left As Word At Data_array(1) Overlay
Dim Speed_right As Word At Data_array(3) Overlay
Dim Curr_left As Word At Data_array(5) Overlay
Dim Curr_right As Word At Data_array(7) Overlay

Die nicht existenten Wordvariablen kann ich aber im Code so behandeln, wie "normale" Wordvariablen

Günter

Richard
27.12.2010, 20:25
Da du noch nicht Ahaaa!!

Ahaaaa. :-)

Ist schon klar, mir war nur nicht bewusst das Overly mit einer festen Adresse anfängt. Damit, mit einer festen Startadresse kann man natürlich auf jede weitere Adresse zugreifen. :-)

Gruß Richard