Dataptr

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Ein Datenzeiger, gebildet aus R8 und R9
    Unter ADR ist beschrieben, das der Lesevorgang aus dem Programmspeicher mithilfe des Z-Register R31|R30 vollzogen wird. Das ist auch so. Der Datapointer[R8|R9] dient gewissermaßen als Zwischenspeicher, da LPM-Instruktionen zum einen nicht mit dem Registerpaar R8|R9 arbeiten und zum anderen, das Z-Register für viele andere Zwecke genutzt wird, sodass dessen Inhalt ständig überschrieben werden würde. Obendrein verfügen die Register R8 und R9 über keine Zeigerfunktionalität, wie etwa die X, Y oder Z Registerpaare.
    Das Setzen des Datapointers R8|R9 ist jedoch eine Voraussetzung, um mit dem Befehl Read Daten aus dem Programmspeicher zu lesen.

    Der Datapointer wird in den meisten Fällen mit dem Befehl Restore gesetzt. Der Datapointer kann aber auch Ziel einer Leseoperation sein:

    BASCOM-Quellcode

    1. Read Dataptr



    Ein Beispiel

    Unter dem Label Adressen sind die Adressen dreier Datentabellen abgelegt, genannt Datensatz_0 bis Datensatz_2.
    Mit Restore Adressen wird der Datapointer zunächst auf die Datenquelle Adressen gesetzt, woraufhin der Befehl Read Dataptr den Datapointer mit der Adresse des ersten Datensatzes 0 lädt. Mit Read können dann die Daten unter Datensatz_0 gelesen werden.

    BASCOM-Quellcode

    1. Dim Lese_byte As Byte
    2. Restore Adressen 'Datenzeiger R8|R9 zeigt auf label Adressen
    3. Read Dataptr 'Adresse von Datensatz_0 wird in den Datenzeiger R8|R9 geladen
    4. Read Lese_byte 'liest das erste Byte von Datensatz_0
    5. Print Lese_byte 'Es wird 11 ausgegeben
    6. End
    7. Adressen:
    8. Adr2 Datensatz_0
    9. Adr2 Datensatz_1
    10. Adr2 Datensatz_2
    11. Datensatz_0:
    12. Data 11 , 12 , 13
    13. Datensatz_1:
    14. Data 21 , 22 , 23
    15. Datensatz_2:
    16. Data 31 , 32 , 33
    Alles anzeigen

    Das gegebene Beispiel unterliegt bis hierher jedoch den Einschränkungen, nur auf das erste Element des ersten Datensatzes zugreifen zu können und macht daher praktisch noch nicht viel Sinn. Es fehlt die Möglichkeit den Datensatz und das zu lesende Element zu wählen. Mit drei Ergänzungen lässt sich der Datapointer auf die gewünschten Daten verschieben.

    • Durch Anlegen einer dem Datapointer überlagerten Pseudovariable Datapointer, wird der Zeiger für entsprechende Manipulationen durch einfache BASIC-Anweisungen zugänglich.

    • Eine Variable Datensatz_nr bestimmt nun die Repositionierung des Datapointers und damit, welche der hinterlegten Adressen geladen werden soll. Da die Daten unter Adressen genauso wie 16 Bit Data-Segmente 2 Byte breit sind, muss der Index Datensatz_nr mit 2 multipliziert werden. Eine einfache Linksverschiebung erfüllt diesen Zweck.

    • Die Variable Data_index erfüllt dann, ähnlich wie Datensatz_nr eine Ausrichtung des Zeigers auf das gefragte Element.

    BASCOM-Quellcode

    1. Dim Lese_byte As Byte
    2. Dim Datapointer As Iram Word At 8 Overlay 'Bezeichner über den Dataptr R8|R9 legen
    3. Dim Datensatz_nr as Byte
    4. Dim Data_index as Byte
    5. Datensatz_nr = 2 'Datensatz aus dem gelesen werden soll
    6. Data_index = 2 'Das 3. Byte des Datensatzes soll gelesen werden
    7. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    8. Restore Adressen 'Datapointer R8|R9 zeigt auf label Adressen
    9. shift Datensatz_nr , left 'Datensatz_nr * 2 , Adressen sind immer 2 Byte lang
    10. Datapointer = Datapointer + Datensatz_nr 'Datapointer entsprechend manipulieren
    11. Read Dataptr 'Adresse von Datensatz3 wird in den DatenzeigerR8|R9 geladen
    12. Datapointer = Datapointer + Data_index 'Datapointer auf gewünschte Byte-Position schieben
    13. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    14. Read Lese_byte 'liest das erste Byte vom gewählten Datensatz
    15. Print Lese_byte 'Es wird 33 ausgegeben
    16. End
    17. Adressen:
    18. Adr2 Datensatz_0
    19. Adr2 Datensatz_1
    20. Adr2 Datensatz_2
    21. Datensatz_0:
    22. Data 11 , 12 , 13
    23. Datensatz_1:
    24. Data 21 , 22 , 23
    25. Datensatz_2:
    26. Data 31 , 32 , 33
    Alles anzeigen

    4.654 mal gelesen

Kommentare 2

  • tschoeatsch -

    'shift Datensatz_nr , left' um eine Stelle, also 'shift Datensatz_nr , left ,1'

    • Galahat -

      ,1 kannst du dir sparen