В качестве операнда должен указываться общий размер (в байтах) всех параметров, помещенных в стек.
Действие команды
pop EIP; вернуться в исходную точку add ESP, число; выровнять стек на «число» байт
Набор соглашений по вызову функций в Win32 API называется STDCALL
Пример. Вычисление среднего двух чисел с использованием соглашения STDCALL
Push B
Push A
Call Srednee
Mov C,eax
Srednee:
mov eax,[esp+8]
add eax,[esp+4]
Cdq
Mov ebx,2
Idiv ebx
Ret 8
Одним из часто используемым применением стека является хранение локальных переменных, для чего в стеке организуется окно (кадр) локальных переменных.
Если обращаться к локальным переменным с помощью регистра ESP, требуется пересчитывать смещения параметров и переменных при любом его изменении.
В таких случаях используется регистр EBP – указатель кадра стека, значение которого остается неизменным. Следовательно, смещения параметров и переменных также фиксируются.
Типичный пролог в подпрограмме:
Push ebp; сохраняем исходное значение ebp
Mov ebp,esp; фиксируем текущий указатель
sub esp, размер; делаем «окно» заданного размера
В результате получаем следующую конфигурацию стека:
Содержимое стека:
[EBP] – исходное значение EBP
[EBP+4] – адрес точки возврата
[EBP+8] – первый параметр
[EBP+12] – второй параметр
...
[EBP–4] – первая переменная
[EBP–8] – вторая переменная
...
Типичный эпилог в подпрограмме:
mov esp,ebp; удаляем «окно» в стеке
Не нашли, что искали? Воспользуйтесь поиском:
|