Вызывает ли инструкция ret добавление регистра esp на 4? - PullRequest
7 голосов
/ 27 ноября 2010

Приводит ли команда "ret" к регистру "esp" добавленное 4?

Ответы [ 3 ]

18 голосов
/ 27 ноября 2010

Да, он выполняет

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
2 голосов
/ 28 ноября 2010

да, потому что в стеке есть (ну, должно быть, см. Переполнение буфера) адрес, где возобновить выполнение программы. Так рет значит

<code>pop ret_addr           ; pop deletes ret_addr from stack by adding 4 to esp
mov eip, ret_addr

, что

pop eip

так же, как и руслик сказал

0 голосов
/ 02 декабря 2010

Да, когда процессор работает в 32-битном защищенном режиме.В реальном режиме или в 16-битном защищенном режиме RET выполняет POP IP, что вызовет ADD ESP, 2 (вместо 4).

...