Заносит в стэк значение EBP
ну я об этом, сначало адрес возврата заносит в стек, после значения ebp?
Адрес возврата заносит call call == push eip + jmp func Поэтому я тебе сказал, что твой аргумент находится на -8, а не на -4. Ибо сначала -4 это адрес возврата, потом -4 это твой EBP, и потом твой аргумент
push 1 call func ; ESP-4 = EIP func: push ebp ; ESP-4 = EBP mov ebp, esp mov eax, dword[ebp] EAX = EBP mov eax, dword[ebp+4] EAX = Адрес возврата call mov eax, dword[ebp+8] EAX = 1 И ещё - не зацикливайся на push ebp. Кадром может стать абсолютно любой регистр, просто EBP изначально сделан, чтобы быть кадром. А проще говоря - кадр это просто копия стэка. Т.е стэк в каком-то зафикисированном положении. Если тебе нужно удобно вычислять аргументы функции, но при этом ты сохраняешь регистры, пушишь аргументы для вызова другой функции, у тебя аргумент будет смещаться чуть ли не на ESP+48 или больше. А если ты создашь кадр, у тебя всегда аргументы будут на EBP+8, EBP+12 и т.д. Это просто для удобства, и необязательно вообще их использовать
Не просто я тут прочитал что:При использовании базового указателя адрес возврата всегда будет иметь значение ebp+4,
Да. Как я и написал выше, ebp (базовый указатель, base pointer)+4 будет адрес возврата. И соотв. ret извлекает из стэка этот адрес возврата, и делает jmp на него Так что всё верно
Я не помню где, но где то читал что команда push ebp сначало в стек заносит адрес возврата, после кадры
Так я же написал - call заносит в стэк адрес возврата А push ebp просто сохраняет значение EBP чтобы в конце его восстановить в изначальное положение, ибо после этой инструкции в EBP заносится значение ESP. А мало ли - в основном коде в этом EBP лежало что-то важное
Обсуждают сегодня