pushl %ebp
movl %esp, %ebp
- сохранить регистр ebp в стеке
- переместить (скопировать) содержимое регистра esp в регистр ebp
«Стиль» куска кода таков, что source - это первый аргумент, а destination - второй; в стиле Intel вы увидите что-то вроде
push ebp
mov ebp, esp
Это простое объяснение этих строк кода. Смысл зависит. Обычно это общий пролог для функций, генерируемых языком высокого уровня (например, C), с соблюдением некоторого соглашения о вызовах. Эпилог должен выглядеть как
movl %ebp, %esp
popl %ebp
ret
Пространство для локальных переменных можно «создать» в стеке, уменьшив значение esp и используя ebp для доступа к данным, сохранив обычное использование esp, например. для другого вызова другой функции (адрес возврата помещается в стек) и избегается перезапись локальных переменных: память между уменьшенным esp и базовым ebp является чем-то вроде «зарезервированной области» в стеке, которую может использовать текущая функция.
Поскольку каждая введенная функция сохраняет как ebp, так и esp, рекурсивный вызов функции (до достижения предела стека) довольно естественен в этом механизме соглашения о вызовах, и вложенная функция может вызываться ad libitum (до тех пор, пока стек заканчивается!).