В качестве примера возьмём программу вычисления факториала из книги
Programming from the Ground Up и исследуем стек программы во время её выполнения.
.text # Здесь начинается текст программы.
.globl _start # Указываем, где расположена точка входа.
.type factorial, @function # Помечаем factorial как функцию.
factorial:
# (S2), (S7)
nop # Нулевая операция, удобно для отладки.
pushl %ebp # Сохраняем %ebp в стек. (S3), (S8)
movl %esp, %ebp # Теперь %ebp указывает на вершину стека.
movl 8(%ebp), %eax # Помещаем в %eax 1-й аргумент функции.
cmpl $1, %eax # Если он равен 1 (базовый случай),
je end_factorial # то переходим к выходу из функции.
decl %eax # Уменьшаем на единицу аргумент функции и
pushl %eax # помещаем его в стэк. (S6)
call factorial # Вызываем саму себя из функции.
movl 8(%ebp), %ebx # Помещаем 1-й аргумент функции в %ebx.
imull %ebx, %eax # В %eax помещаем результат %eax * %ebx.
end_factorial:
movl %ebp, %esp # Делаем %ebp вершиной стека. (S12)
popl %ebp # Помещаем из стека в %ebp. (S10), (S13)
ret # Выходим из функции. (S11), (S14)
_start:
pushl $2 # Помещаем аргумент функции factorial
# в стек. (S1)
call factorial # Вызываем функцию factorial.
addl $4, %esp # Очищаем стек от аргумента функции. (S15)
movl %eax, %ebx # Результат функции используем как код
# выхода из программы.
movl $1, %eax # Заказываем системный вызов exit
int $0x80 # и вызываем его.
Собираем и запускаем программу: