02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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:

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!