Advanced Topics

Stack Types and Instructions

The ARM supports four different stack implementations. These are categorised by two axes, namely Ascending versus Descending and Empty versus Full.

An Ascending stack grows upwards. It starts from a low memory address and, as items are pushed onto it, progresses to higher memory addresses.

A Descending stack grows downwards. It starts from a high memory address, and as items are pushed onto it, progresses to lower memory addresses. The previous examples have been of a Descending stack.

In an Empty stack, the stack pointers points to the next free (empty) location on the stack, i.e. the place where the next item to be pushed onto the stack will be stored.

In a Full stack, the stack pointer points to the topmost item in the stack, i.e. the location of the last item to be pushed onto the stack.

As matching these four distinct stack implementations to multiple-register loads and stores has the potential for confusion, the ARM assembly language has specific stack manipulation instructions that indicate through their mnemonic the type of stack involved.

STMEA r13!, {r0-r2} ; Push data onto an Empty Ascending Stack
LDMEA r13!, {r0-r2} ; Pop data off an Empty Ascending Stack
STMED r13!, {r0-r2} ; Push data onto an Empty Descending Stack
LDMED r13!, {r0-r2} ; Pop data off an Empty Descending Stack
STMFA r13!, {r0-r2} ; Push data onto a Full Ascending Stack
LDMFA r13!, {r0-r2} ; Pop data off a Full Ascending Stack
STMFD r13!, {r0-r2} ; Push data onto a Full Descending Stack
LDMFD r13!, {r0-r2} ; Pop data off a Full Descending Stack

These stack manipulation instructions should be used in preference to the standard multiple-register load and store instructions. However, all of the stack manipulation instructions can be mapped to standard forms:

Stack Standard Type
STMFA STMIB Pre-increment store
STMEA STMIA Post-increment store
STMFD STMDB Pre-decrement store
STMED STMDA Post-decrement store
LDMED LDMIB Pre-increment load
LDMFD LDMIA Post-increment load
LDMEA LDMDB Pre-increment load
LDMFA LDMDA Pre-increment load