Да, он выполняет
pop eip
Вы можете использовать
mov eax, [esp]
jmp eax
чтобы избежать этого.
РЕДАКТИРОВАТЬ: Это именно то, что делает ret
. Например, jmp rel_offet
- это не что иное, как скрытый add eip, offset
, или jmp absolute_offset
- это mov eip, absolute_offset
. Конечно, есть различия в том, как процессор обрабатывает их, но с точки зрения программиста это все, что происходит.
Кроме того, существует специальная форма ret
: ret imm8
, которая также добавляет это значение imm8 к esp
: например, функция __stdcall
использует его для сброса своих параметров из стека. Не говоря уже о версии retf
, используемой в 16-битном режиме, которая также извлекает cs
из стека.
EDIT2:
pop register
означает:
mov register, [esp]
add esp, 4