Forum: Mikrocontroller und Digitale Elektronik Z-Pointer Atmega8 Assembler


von Matthias (Gast)


Lesenswert?

Hallo Leute,

ich bin ein µC Einsteiger und muss eine kleines Projekt mit einem 
Atmega8 realisieren. Ich programmiere nur in Assembler.

Ich bin beim Thema Z-Pointer angelangt und habe dazu einige Fragen.


Kein Problem ist für mich, wenn ich folgendes  Szenario habe und Daten 
von 1 weg brache (Z+, ...):
1
Tabelle: .DB 1, 44, 21, 134, 111, 22

Wie kann ich die Daten von hinten abrufen (22, 111, ...) ?


Dach noch folgende Tabelle:
1
Tabelle: 
2
     
3
     .DB 1, 44, 21, 134, 111, 22
4
     .DB 2, 33, 11, 34
5
     .DB 5, 6, 9, 12

Wie kann ich da z.B.  nur die zweite Reihe (.DB 2, 33, 11, 34) abrufen.

Wie kann ich nur zu einer einzelne Ziffer springen (z.B. 134 o. 11 o. 6)



Ich habe leider nach langer Suche im Netz keine Antworten zu meinen 
Fragen gefunden.

Ich bitte euch um eure Hilfe.

Danke!

mfg
Matthias

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:

> Wie kann ich die Daten von hinten abrufen (22, 111, ...) ?

Die Antwort auf all deine Fragen lautet:
Es gibt 2 Möglichkeiten
* Entweder du setzt dir ein Label an das Ende der Daten
* oder aber du weißt, wieviele Daten an den jeweils bewussten Stellen
  in Bezug auf ein dir namentlich bekanntes Label vorhanden sind
  und du addierst/subtrahierst diese Anzahl entsprechend zum Z-Pointer
  dazu.

Das ist im Grunde nichts anderes, als wie wenn du weist, dass in einem 
Buch die dich interessierende Information 5 Seiten nach dem Anfang von 
Kapitel 8 steht. ALso siehst du im Inhaltsverzeichnis die Seitenzahl für 
Kapitel 8 nach, zählst noch die 5 dazu und hast die Seitenzahl auf der 
die Information zu finden ist.
Wenn du aber weißt, dass du die Seiten vom Kapitel 8 von hinten her 
durchblättern willst, dann suchst du dir im Inhaltsverzeichnis die 
Seitenzahl für Kapitel 9 (also dem Kapitel dahinter) und weißt, dass die 
Seite davor die letzte von Kapitel 8 sein muss. Und von dort geht es 
dann Seite für Seite nach vorne, bis du am Anfang von Kapitel 8 (dessen 
Seitenzahl hast du wiederrum aus dem Inhaltsverzeichnis) angelangt bist.

Im Assembler sind die 'Kapitel' deine Label und das Inhaltsverzeichnis 
führt der Assembler für dich, indem er sich die Seitenzahl, pardon die 
Adresse im Speicher merkt, an der das Label steht und du nur den 
Labelnamen benutzen musst, der vom Assembler durch diese Zahl ersetzt 
wird.

Eigentlich ganz einfach.

von Matthias (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Eigentlich ganz einfach

Muss ich ausgiebig Testen :-)

Danke für die schnelle Antwort!

mfg,
Matthias

von Matthias (Gast)


Lesenswert?

Hallo,

nun weiß ich nicht weiter...

ich habe folgenden Code:
1
.cseg
2
3
Daten:
4
5
 .db 0b00000001, 0
6
 .db 0b00000011, 0
7
 .db 0b00000111, 0

Wenn ich im Prog. den Zeiger immer  mit Z+ erhöhe, bekomme ich die daten 
immer nur aus der ersten Zeile (.db 0b00000001, 0) aber nie aus der 
zweiten oder dritten.

Folgendes funktioniert:
1
.cseg
2
3
Daten:
4
5
 .db 0b00000001,0b00000011, 0b00000111, 0

Wie löse ich das oben genannte Problen?

mfg
Matthias

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

Hallo,

Matthias schrieb:
> Wenn ich im Prog. den Zeiger immer  mit Z+ erhöhe, bekomme ich die daten
> immer nur aus der ersten Zeile (.db 0b00000001, 0) aber nie aus der
> zweiten oder dritten.

Zeige mal bitte den Code dazu.

Matthias schrieb:
> Folgendes funktioniert:
> .cseg
>
> Daten:
>
>  .db 0b00000001,0b00000011, 0b00000111, 0

Hier kommen andere Werte weil es eine andere Tabelle ist. Oben hast du 
ja nach jedem Byte eine 0 angehängt.Um fortlaufende Tabellen zu 
schreiben kann man auch ...
1
.cseg
2
3
Daten:
4
5
 .db 0b00000001,\
6
     0b00000011,\
7
     0b00000111,\
8
     0

... schreiben.


Grüsse

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.