Манипуляции со стеком
- PUSH поместить слово или двойное слово в стек
- POP извлечь значение из стека
Intel CPU широко используют стек. Другие CPU, которые имеют намного больше-регистров, могут через них передавать параметры, но Intel CPU передают большинство параметров через стек. Стек начинается в старших адресах памяти и растет вниз. Обе эти инструкции неявно изменяют регистр ESP, который указывает текущую вершину стека. После операции PUSH значение регистра ESP уменьшается, после операции POP — увеличивается.
В стек можно помещать значения регистров, адреса ячеек памяти или жестко закодированные числа. Извлеченный элемент стека обычно перемещается в регистр. Ключевой характеристикой стека CPU является организация его данных в виде очереди LIFO (Last In, First Out). Если в стек помещаются значения трех регистров, то извлекать их нужно в обратном порядке, как это делает функция PushPop:
void PushPop ( void )
{
_asm
{
// Сохранить значения регистров ЕАХ, ЕСХ и EDX. ,
PUSH ЕАХ
PUSH ЕСХ
PUSH EDX
// Здесь нужно выполнить некоторые операции, которые могут
// изменить значения указанных регистров.
// Восстановить ранее сохраненные регистры. Обратите внимание,
// что они удаляются из стека в LIFO-порядке.
POP EDX .
POP ECX
POP EAX
}
}
Хотя существуют гораздо более эффективные способы обмена значений, инструкции PUSH и POP позволяют обменять значения регистров. Обмен происходит, когда программист изменяет порядок pop-инструкций:
void SwapRegistersWithPushAndPop ( void )
{
_asm
{
// Обменять значения регистров EAX и ЕВХ , используя стек.
PUSH EAX
PUSH EBX
POP EAX
POP EBX
}
}
- PUSHAD поместить в стек значения всех регистров общего назначения
- POPAD извлечь из стека значения всех регистров общего назначения
С этими инструкциями можно иногда столкнуться при отладке системного кода. Они эквивалентны длинным цепочкам PUSH-инструкций для сохранения всех общих регистров и pop-инструкций — для их восстановления.