beginner_de
beginner_de
beginner_de
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Avr-Asm-Tutorial S. 44<br />
Buffer_End: ; ein Label fuer das En<strong>de</strong> <strong>de</strong>s Datenpuffers<br />
;<br />
.CSEG ; En<strong>de</strong> <strong>de</strong>s Datensegments, Beginn <strong>de</strong>s Programmsegments<br />
Das Datensegment enthält also ausschließlich Labels, über die die entsprechen<strong>de</strong>n reservierten<br />
Speicherzellen später adressiert wer<strong>de</strong>n können, und .BYTE-Direktiven, die die Anzahl <strong>de</strong>r zu reservieren<strong>de</strong>n<br />
Zellen angeben. Ziel <strong>de</strong>r ganzen Angelegenheit ist das Anlegen einer flexibel än<strong>de</strong>rbaren<br />
Struktur für <strong>de</strong>n Zugriff über Adresssymbole. Inhalte für diese Speicherzellen wer<strong>de</strong>n dabei<br />
nicht erzeugt, es gibt auch keine Möglichkeit, <strong>de</strong>n Inhalt von SRAM-Speicherzellen beim Brennen<br />
<strong>de</strong>s Chips zu manipulieren.<br />
Zugriffe auf das SRAM über Pointer<br />
Eine weitere Adressierungsart für SRAM-Zugriffe ist die Verwendung von Pointern, auch Zeiger<br />
genannt. Dazu braucht es zwei Register, die die 16-Bit-Adresse enthalten. Wie bereits in <strong>de</strong>r Pointer-Register-Abteilung<br />
erläutert sind das die Registerpaare X mit XL/XH (R26, R27), Y mit YL/YH<br />
(R28, R29) und Z mit ZL und ZH (R30, R31). Sie erlauben <strong>de</strong>n Zugriff auf die jeweils adressierte<br />
Speicherzelle direkt (z.B. ST X, R1), nach vorherigem Vermin<strong>de</strong>rn <strong>de</strong>r Adresse um Eins (z.B. ST<br />
-X,R1) o<strong>de</strong>r mit anschließen<strong>de</strong>m Erhöhen um Eins (z.B. ST X+, R1). Ein vollständiger Zugriff auf<br />
drei Zellen sieht also etwa so aus:<br />
.EQU MeineLieblingsZelle = 0x0060<br />
.DEF MeinLieblingsRegister = R1<br />
.DEF NochEinRegister = R2<br />
.DEF UndNochEinRegister = R3<br />
LDI XH, HIGH(MeineLieblingszelle)<br />
LDI XL, LOW(MeineLieblingszelle)<br />
LD MeinLieblingsregister, X+<br />
LD NochEinRegister, X+<br />
LD UndNochEinRegister, X<br />
Sehr einfach zu bedienen, diese Pointer. Und nach meinem Dafürhalten genauso einfach (o<strong>de</strong>r<br />
schwer) zu verstehen wie die Konstruktion mit <strong>de</strong>m Dach in gewissen Hochsprachen.<br />
Indizierte Zugriffe über Pointer<br />
Die dritte Konstruktion ist etwas exotischer und nur erfahrene Programmierer greifen in ihrer unermesslichen<br />
Not danach. Nehmen wir mal an, wir müssen sehr oft und an verschie<strong>de</strong>nen Stellen eines<br />
Programmes auf die drei Positionen im SRAM zugreifen, weil dort irgendwelche wertvollen Informationen<br />
stehen. Nehmen wir ferner an, wir hätten gera<strong>de</strong> eines <strong>de</strong>r Pointer-Register so frei, dass<br />
wir es dauerhaft für diesen Zweck opfern könnten. Dann bleibt bei <strong>de</strong>m Zugriff nach ST/LD-Muster<br />
immer noch das Problem, dass wir das Pointer-Register immer anpassen und nach <strong>de</strong>m Zugriff wie<strong>de</strong>r<br />
in einen <strong>de</strong>finierten Zustand versetzen müssten. Das ist eklig.<br />
Zur Vermeidung (und zur Verwirrung von Anfängern) hat man sich <strong>de</strong>n Zugriff mit Offset einfallen<br />
lassen (<strong>de</strong>utsch etwa: Ablage). Bei diesem Zugriff wird das eigentliche Zeiger-Register nicht verän<strong>de</strong>rt,<br />
<strong>de</strong>r Zugriff erfolgt mit temporärer Addition eines festen Wertes. Im obigen Beispiel wür<strong>de</strong> also<br />
folgen<strong>de</strong> Konstruktion beim Zugriff auf die Speicherzelle 0x0062 erfolgen. Zuerst wäre irgendwann<br />
das Pointer-Register zu setzen: