popl %ebp
Это кажется %ebp
является ненужным потому что pop
для операции стека не нужен параметр.
Почему это имеет смысл?
Из http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
pop ] - Извлечь стек
Команда извлечения удаляет 4-байтовый элемент данных из вершины аппаратно поддерживаемого стека в указанный операнд (т. Е. Регистр или ячейку памяти). Сначала он перемещает 4 байта, расположенные в ячейке памяти [SP], в указанный регистр или ячейку памяти, а затем увеличивает SP на 4.
Синтаксис
pop
popПримеры
pop edi - вставить верхний элемент стека в EDI.
pop [ebx] - вставить верхний элемент стека в память в четырех байтах, начиная с ячейки EBX.
Еще одна хорошая ссылка - http://en.wikibooks.org/wiki/X86_Assembly , и она доступна в форме PDF .
Чтобы развернуть ответ Андрея, помимо увеличения указателя стека над выталкиваемым элементом, вытянутый элемент также копируется в адрес назначения или регистр.
Приведенная вами инструкция более или менее эквивалентна двум инструкциям (синтаксис Intel)
add esp, 4 # increment the stack pointer
mov ebp, [esp - 4] # load what ESP was pointing to
, который, я думаю, заключен в синтаксисе att (gas)
add $4, %esp
mov -4(%esp), %ebp
Конечно pop
не изменяет ФЛАГИ (представьте, что вы выполняете add
с помощью LEA), и это не прерывается между загрузкой и добавлением.
Для особого случая pop esp
выполнение второй загрузки в псевдокоде воспроизводит фактическое задокументированное поведение приращения перед данными из старого top- расположение из стека записывается в ESP. И выполнения приращения перед вычислением адреса для всплывающего окна назначения памяти с использованием % esp
как части режима адресации, например popl 12 (% esp,% edx, 4)