Der Stack wird hauptsächlich benutzt, um temporäre oder lokale Daten zu speichern und um Rücksprungadressen bei der Ausführung von Interruptrouinen und Unterprogrammen zu sichern. Der Stack-Pointer zeigt immer auf die nächste freie Speicherstelle im Stack. Der Stack ist so aufgebaut, dass der von hohen Speicheradressen hin zu den unteren wächst. Das bedeutet, dass beim Sichern eines Datums in den Stack (PUSH-Befehl) der Stack-Pointer dekrementiert wird.
Der Stack-Pointer zeigt auf eine Speicherstelle im SRAM, diese muss durch das Programm zunächst bestimmt werden, bevor ein erstes Unterprogramm ausgeführt wird oder die Interrupts freigegeben werden. Der Stack-Pointer muss auf jeden Fall über 60h eingestellt werden, da er sonst in den Bereich der I/O-Speicher zeigt und diese überschreibt. Der Stack-Pointer wird um eins dekrementiert, wenn ein Datum mit dem PUSH-Befehl in den Stack gesichert wird und um zwei dekrementiert, wenn eine Rücksprungadresse gesichert wird. Beim zurückholen der Daten wird der Stack-Pointer inkrementiert und zwar um eins, wenn ein Datum mit dem POP-Befehl zurückgeholt wird bzw. um zwei inkrementiert, wenn Rücksprungadressen mit den RET oder RETI-Befehlen aus dem Stack ausgelesen werden.
Der Stack-Pointer besteht aus zwei 8 Bit – Registern im I/O-Speicher. Die Anzahl der Bits, die wirklich für die Adressierung verwendet werden, hängt von der Größe des zu adressierenden Speicherbereiches ab. In einigen AVR-Controllern ist der Speicherbereich so klein, dass nur das Low-Byte des Stack-Pointers verwendet wird. In diesen Fällen ist das High-Byte gar nicht implementiert.
Stack Pointer des ATmega8