Menu
Работа со стековой памятью
Программы на языке Ассемблер, также как и на других языках программирования, используют команды вызова подпрограмм и возврата из подпрограмм, это команды: Call и Ret. Команда Call, также как и любая другая команда ветвления, в качестве операнда использует адрес или метку точки перехода.
Команда Call вызывает выполнение последовательно двух действий:
1. Содержимое программного счетчика, равное адресу ячейки памяти ПЗУ с командой, которая будет выполняться на последующем шаге, запоминается в стековой памяти, чтобы использовать ее при возврате из подпрограммы.
2. В регистр «программный счетчик» загружается операнд команды Call, равный численному адресу первой команды вызываемой подпрограммы.
При возврате из подпрограммы по команде Ret происходит только одно действие: в программный счетчик загружается число из стековой памяти, которое было ранее туда загружено по команде Call. Соответственно после команды Ret будет выполняться команда, следующая в программе за командой Call.
Если в подпрограмме происходит обращение к другой подпрограмме (вложенные подпрограммы), то сохранение точек возврата происходит аналогичным образом.
Под стековой памятью мы понимаем область ОЗУ или Data со старшими адресами. Если рассматривать ОЗУ как набор ячеек, где ячейки с младшими адресами расположены наверху, а со старшими – внизу, то при включении данных в стек (стопка бумаг) эти данные как бы кладутся сверху ранее занятых ячеек стека, а при извлечении данных из стека, они берутся из верхних ячеек стековой памяти. Контролирует стековую память специальный регистр SP (Stack-Pointer), который содержит адрес ячейки памяти соответствующей верхушке стека. Этот регистр автоматически изменяет свое содержимое на два (увеличивает или уменьшает) при выполнении команд обращения к стековой памяти (Push, Pop, Call, Ret).
Добавлять комментарии могут только зарегистрированные пользователи.
Регистрация Вход