Отладка приложений

Манипуляции со стеком


  • 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-инструкций — для их восстановления.



Содержание раздела