К
Size: a a a
E
A
D
A
AP
E
call
- заносит адрес возврата на данный указатель стэка ([esp]
), а push
:sub esp, 4 ; или 8, и rspТаким образом, стэк будет выглядеть так:
mov [esp], operand
ESP = 0x400008То есть,
push eax ; ESP = 0x400004
(значение EAX находится на 0x400008)
call func ; ESP = 0x400004
push
положил значение EAX в 0x400008
, и уменьшил указатель на 4, а call
просто положил адрес возврата на данный указатель, он не уменьшал.[ESP+4]
, потому что на [ESP]
будет адрес возврата.mov operand, [esp]То есть, он возьмёт адрес из данного указателя на стэк, где лежит адрес возврата, а после чего увеличит
add esp, 4 ; Или 8, и rsp
ESP
на 4, таким образом, ESP
уже будет на +4, где нет никакого адреса возврата, вместо него там лежит наш параметр.pop
- можно. Нужно сделать так:add esp, 4То есть:
pop eax
sub esp, 8
ret
[ESP]
-> Адрес возврата[ESP+4]
-> Параметрpop
-> ESP
будет стоять уже на +8, потому что он делает ещё один add esp, 4
, поэтому его нужно вернуть на наш адрес возврата. Для x64 будет:add esp, 8Но делать так не нужно, смысла от этого - ноль
pop eax
sub esp, 16
ret
ВВ
d
E
d
d
E
d