>Bisher habe ich nur den Stackpointer genutzt und zwar mir push, pop,
>rcall und ret.
Genau. der Stackpointer zeigt auf eine Stelle im RAM aus denen er bei
pop und ret Werte liest, bei call und rcall Werte schreibt. Soweit OK.
Analog geht es beim ATMEGA8 (und bei vielen anderen Modellen von Atmel)
mit den sogenannten X, Y und Z Register. Das sind jeweils zwei 8-Bit
Register die bei manchen Befehlen als 16 Bit Register betrachtet werden.
Es gibt Befehle die auf das FLASH als auch solche die auf das RAM
zugreifen und dabei diese X, Y, und Z-Register benutzen. (Zusätzlich
kommt bei grossem Speicher noch eines von zwei weiteren Zeigerregistern
hinzu).
Siehe etwa LD, LDS ST, STS, für das RAM, IJMP, ICALL, LPM für das
Programm-Flash.
Ganz allgemein formuliert kann man damit auf Speicherstellen zugreifen
die man bei der Programmerstellung noch nicht genau festlegen will Z.B.
wenn man auf die Elemente eines Arrays zugreifen will. Dann würde man
eines der Register X, Y, Z mit der Adresse des ersten Elementes laden
und das Register dann immer entsprechend inkrementieren (oder auch
dekrementieren).
Beim Flash geht das entsprechend und hat in der Harvard-Architektur
einige Einschränkungen. Entweder kann man das FLASH garnicht oder nur
indirekt über einen weiteren Befehl oder Ähnliches beschreiben. Oft
angewendet wird aber die Methode eine Konstante aus dem Flash in ein
Register zu laden. Hat man wiederrum ein Array von Konstanten geht das
genau so wie oben beschrieben.
Schau Dir am besten mal die Beschreibung der Befehle LD, LDS ST, STS,
für das RAM, IJMP, ICALL und LPM an. Dann sollte es klarer werden.