Optron #29
20 июля 1999

Ликбез - Ассемблер взгляд издалека: Что такое стек. Определение области стека.

<b>Ликбез</b> - Ассемблер взгляд издалека: Что   такое  стек. Определение области стека.
       Ассемблер: взгляд издалека.

  Продолжение.
           Начало в || 20, 21, 24, 25, 28

{}Инфарх, 1999

             Что такое стек?

  Наверняка вы уже слышали это слово.  По-
пробуем выяснить, что скрывается за ним.
  "Стеком" называют  память,  при работе с
которой  используется  принцип,  именуемый
"first in, last out (первым вошёл, послед-
ним  вышел)".  Это  означает,  что  данные
(слова) заносятся на стек последовательно,
одно за другим, и считываются с него в об-
ратном  порядке.  При этом доступ возможен
только к так называемой  "вершине  стека",
т.е. к последнему помещённому туда слову.
  Стек предназначен для хранения процессо-
ром временных данных,  таких, в частности,
как адреса возврата из подпрограмм.
  В процессоре Z80 за размещением информа-
ции в стеке следит регистр SP,  в  котором
сохраняется  адрес вершины стека.  Отметим
один важный момент:  при занесении очеред-
ного слова в стек адрес его вершины смеща-
ется вниз (к  младшим  адресам),  т.е.  не
увеличивается,  а уменьшается. Таким обра-
зом,  если в SP у вас записан адрес #6000,
то  следующее  слово,  помещённое на стек,
разместится в памяти по адресу не #6002, a
#5FFE.  Так  стек адресуется в большинстве
микропроцессорных систем (но, конечно, нет
правил без исключений...)


        Определение области стека

  Конечно,   с  областью,  отведённой  под
стек, можно работать, как и с любой другой
областью памяти. Но, используя специальные
команды  процессора,  предназначенные  для
работы со стеком,  можно значительно уско-
рить и упростить работу программы.
  Как же использовать стек?
  Для начала  надо позаботиться о записи в
SP адреса  вершины  стека.  Команды  здесь
выглядят так:

  LD   SP,(addr)
  LD   SP,IX
  LD   SP,IY
  LD   SP,HL
  LD   SP,nn

  Влияния  на  флаги  это  не оказывает. А
после одного из вышеприведённых действий в
SP окажется желаемое значение. Но если вам
этого  недостаточно, то можно использовать
следующие действия:

  INC  SP
  DEC  SP

  Тем самым вы уж точно сможете придать SP
требуемое значение. А если говорить о вли-
янии  на флаги, то ничего необычного здесь
тоже  не  происходит.  Всё в пределах того
типа команд, которые используются в опера-
ции.


             Работа со стеком

  В  самом простом варианте на стеке можно
размещать информацию и, естественно, полу-
чать её оттуда.
  Итак, размещение. Для этого мы использу-
ем команду "PUSH" в следующих вариантах:

  PUSH rr
  PUSH ii

  Как и принято у нас, "rr" обозначает ре-
гистровую пару, а "ii" - индексный регистр
IX или IY.  Когда процессор  столкнётся  с
суровой необходимостью выполнить такую ко-
манду,  то первым делом уменьшит  содержа-
щийся  в  SP адрес на два.  После этого по
получившемуся адресу будет  переслано  со-
держимое регистровой пары, указанной после
"PUSH".  Таким методом мы можем  сохранять
на стеке данные.
  А как  их  оттуда  снимать?  Тоже  очень
просто.  Команда, обратная "PUSH", записы-
вается как "POP". Запись её полностью ана-
логична вышеописанной:

  POP  rr
  POP  ii

  Выполняя эту команду,  процессор возьмёт
слово, адрес которого хранится в SP, и по-
местит его в регистровую пару, указанную в
команде,  после чего содержимое  SP  будет
увеличено на два. На будущее давайте дого-
воримся:  если вам встретится  фраза  типа
"поместить  на стек" или "снять со стека",
то подразумевается и естественная  коррек-
ция содержимого SP.  И ещё один совет: при
работе со стеком  не  забывайте,  в  какой
последовательности вы помещали в него дан-
ные,  иначе ваша программа рискует  уподо-
биться Windows'95!
  А вот ещё несколько команд для работы со
стеком:

  EX (SP),HL
  EX (SP),IX
  EX (SP),IY

  По  ним происходит обмен между содежимым
вершины  стека  и  содержимым  HL  или ин-
дексного регистра;

  ADC HL,SP

  ADD HL,SP
  ADD IX,SP
  ADD IY,SP

  Применяя их, значение SP можно использо-
вать в некоторых видах вычислений.
  А  теперь - о флагах. Как "PUSH", "POP",
так  и  "EX"  никакого влияния на флаги не
оказывают, но... если вы выполните команду
"POP AF", то, естественно, флаги будут уже
далеко  не  те,  так  что  не забывайте об
этом!   А   что   касается  арифметических
действий, то там воздействие на флаги тоже
вполне   обычное  и  соответствует  прочим
арифметическим операциям.


               Подпрограммы

  Для  начала определимся с терминологией.
"Подпрограммой"  называют фрамент основной
программы,  который  может  быть вызван из
любого  места  оной  для  выполнения опре-
делённой  задачи,  после отработки которой
управление возвращается основной программе
с того места, откуда была вызвана подпрог-
рамма.  Для её вызова используется команда
"CALL",  запись  которой  может  принимать
следующие формы:

  CALL addr
  CALL cc,addr

  Надеюсь,  вы не забыли, что "cc" обозна-
чает  возможность использования условия. А
условия допускаются такие:

       C, M, NC, NZ, P, PE, PO, Z

  Как водится,  выполняется команда "CALL"
не  просто,  а  очень просто. Встретив её,
процессор  поместит на стек адрес команды,
следующей  за "CALL". После этого управле-
ние  будет передано тому фрагмету програм-
мы,  который  расположен по адресу "addr".
Вот так и произойдёт вызов подпрограммы. А
как   вернуться  из  неё?  И  того  проще!
Подпрограмма должна заканчиваться командой
"RET",  встретив которую, процессор снимет
с  вершины  стека  слово для использования
его  в  качестве  адреса перехода. Если вы
ничего  со стеком не начудили, этим словом
будет   адрес,  помещённый  туда  командой
"CALL".
  Теперь вам понятно упоминание в одном из
первых наших занятий команды "RET"? Дело в
том,  что  когда вы запускаете програму из
Ассемблера,  он  выполняет её как  подпро-
грамму, и,  что естественно,  рассчитывает
на корректный выход.
  И напоследок - о вариантах написания ко-
манды "RET":

  RET
  RET  cc

  Вот  и все сложности! Даже адрес не надо
указывать.  Условия  здесь  тоже возможны.
Они  полностью  аналогичны  тем,  что  ис-
пользует команда "CALL".


              Неужели всё???

  А вот и нет!  Осталась ещё одна команда,
вполне  подходящая к теме сегодняшнего за-
нятия.  Это так называемый  "вызов рестар-
та".
  Рестарт  -  это почти то же самое, что и
"CALL",  но  он  позволяет совершать вызов
только  восьми  процедур,  расположенных в
первых 256 байтах памяти:

  #00, #08, #10, #18, #20, #28, #30, #38

  Преимуществом команды рестарта (RST) яв-
ляется  то,  что  она  занимает всего один
байт  и срабатывает быстрее, чем "CALL". А
недостатком  -  то, что применить её можно
только  для  обращения  к  одной из восьми
приведённых  выше  ячеек.  В Спектруме все
эти  адреса  относятся  к  ПЗУ, но если вы
знаете,  что  они  делают,  то  можете ис-
пользовать их в своих программах.
  Варианты  записи команд рестарта следую-
щие:

  RST  #00
  RST  #08
  RST  #10
  RST  #18
  RST  #20
  RST  #28
  RST  #30
  RST  #38


           Небольшое примечание

  Итак, со стеком мы разобрались.
  Добавлю ещё пару слов. Электронная газе-
та  "Полесье" тоже приступила к публикации
заметок типа нашего  "Ликбеза".  Так  что,
если  заинтересуетесь  -  обращайтесь  и к
этому изданию за дополнительной информаци-
ей.
  Вот  и всё на сегодня. Не бойтесь экспе-
риментировать, ведь "на глюках учатся"! До
новых встреч!

          Продолжение следует...

              ──══════════──





Другие статьи номера:

CC'99 - Chaos Construction'99 demo party.

ZX-Обоз - Обзор электронной прессы: KrNews 9, ProFi-BBS, ZX-Hard 1, Полесье n6 , Born Dead 9, ZX-News 48, Plutonium 12, Fantastic 11.

Железо - Югославия - полигон?

Ликбез - Ассемблер взгляд издалека: Что такое стек. Определение области стека.

Лит. страничка - Гриф "Y-II" (Дневник - окончание).

Реклама - Реклама и объявления...

Страницы истории - Спектрум - от макета - к изделию (как это было).

Четыре килобайта - Новая BBS во Львове для пользователей CDOS-модемов.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Еще раз о настоящих программистах - Каким надо быть высокомерным идиотом для того, чтобы изобрести обучающий язык таким, как Паскаль.
Beatles Forever - "Как ветра осенние" (декабрь 1985 г).
Обо всём - шедевры цифровой графомании: история появления компьютеров.
Застрял ? - Описание игры "Mermaid Madness".
scene 0fF! - письмо от freeman^freeart.

В этот день...   30 октября