Assembler - язык неограниченных возможностей


Команды передачи управления - часть 6


/p>

Команда ENTER создает стековый кадр заданного размера и уровня вложенности (оба операнда — числа; уровень вложенности может принимать значения только от 0 до 31) для вызова процедуры, использующей динамическое распределение памяти в стеке для своих локальных переменных. Так, команда

enter 2048,3

помещает в стек указатели на стековый кадр текущей процедуры и той, из которой вызывалась текущая, создает стековый кадр размером 2 килобайта для вызываемой процедуры и помещает в ЕВР адрес начала кадра. Пусть процедура MAIN имеет уровень вложенности 0, процедура PROCA запускается из MAIN и имеет уровень вложенности 1, и PROCB запускается из PROCA с уровнем вложенности 2. Тогда стек при входе в процедуру MAIN имеет вид, показанный на рис. 10.


Рис. 10. Стековый кадр процедуры 0-го уровня (MAIN)


Рис. 10. Стековый кадр процедуры 0-го уровня (MAIN)


Теперь процедура MAIN может определять свои локальные переменные в памяти, используя текущее значение ЕВР.

На первом уровне вложенности процедура PROCA, как показано на рис. 11, может создавать свои локальные переменные, используя текущее значение EBP, и получает доступ к локальным переменным процедуры MAIN, используя значение ЕВР для MAIN, помещенное в стек командой ENTER.


Рис. 11. Стековый кадр процедуры 1-го уровня (PROCA)


Рис. 11. Стековый кадр процедуры 1-го уровня (PROCA)


Процедура PROCB на втором уровне вложенности (рис. 12) получает доступ как к локальным переменным процедуры PROCA, используя значение ЕВР для PROCA, так и к локальным переменным процедуры МАIN, используя значение ЕВР для MAIN.


Рис. 12. Стековый кадр процедуры 2-го уровня (PROCB)


Рис. 12. Стековый кадр процедуры 2-го уровня (PROCB)


  • Команда:
  • LEAVE
  • Назначение:
  • Выход из процедуры
  • Процессор:
  • 80186

    Команда LEAVE выполняет действия, обратные команде ENTER. Фактически эта команда только копирует содержимое ЕВР в ESP, тем самым выбрасывая из стека весь кадр, созданный последней выполненной командой ENTER, и считывает из стека ЕВР для предыдущей процедуры, что одновременно восстанавливает и значение, которое имел ESP до вызова последней команды ENTER.





    Начало  Назад  Вперед