Счетчик команд и стековая память
Два важных регистра, которые существуют в любом микропроцессоре или микроконтроллере, – это счетчик команд и указатель стека.
Счетчик команд – это специализированный внутренний регистр микроконтроллера, в котором хранится адрес текущей выполняемой команды.
Этот регистр не доступен для программиста в том смысле, что не существует команд прямой записи или чтения его содержимого. Размер счетчика команд составляет для разных микроконтроллеров AVR от 9 до 12 разрядов.
Количество разрядов счетчика команд зависит от размера адресуемой программной памяти конкретного микроконтроллера. После сброса микроконтроллера в счетчик команд записывается ноль.
Затем процессор переходит в режим выполнения программы. В процессе выполнения программы счетчик всегда указывает на текущую выполняемую команду. При считывании кода команды значение счетчика увеличивается на один или два (в зависимости от длины команды). При выполнении команд безусловного и условного переходов содержимое счетчика резко меняется. В него записывается новое значение адреса. Новое значение адреса называется адресом перехода.
Кроме традиционных команд условного перехода, микроконтроллеры серии AVR имеют еще один вид команд, который можно рассматривать как их модификацию. Это команды типа «проверка/пропуск». В командах этого типа производится проверка некоего условия, и результат проверки влияет на выполнение следующей команды. Если условие истинно, то следующая команда игнорируется.
То есть сама команда не выполняется, изменяется лишь содержимое счетчика команд. Это содержимое увеличивается либо на единицу, либо на две единицы, в зависимости от длины пропускаемой команды. Если условие ложно, то команда не пропускается, а выполняется как обычно. Теперь перейдем к указателю стека.
Указатель стека – это специальный регистр, который предназначен для организации так называемой стековой памяти. Стековая память широко применяется в вычислительной технике. Вообще, стек – это некий буфер, состоящий из нескольких ячеек памяти, имеющий один вход, который одновременно является и выходом.
Запись в стековую память и чтение из нее производится по принципу «последний зашел – первый вышел». Стековую память очень часто используют при программировании. Особенно удобно использовать стек для сохранения данных при входе в подпрограмму и восстановления их перед выходом.
В микроконтроллерах серии AVR применяется широко распространенный способ организации стековой памяти, когда в качестве стека используется часть ОЗУ Для реализации принципа «последний зашел – первый вышел» и служит регистр-указатель стека. В зависимости от размеров ОЗУ, разрядность указателя стека бывает разная. В микроконтроллерах с небольшим объемом ОЗУ используется восьмиразрядный указатель стека. Он представляет собой один регистр ввода-вывода и доступен для свободного считывания и записи. Называется такой регистр spl. Для ОЗУ больших размеров к регистру spl добавляется еще один регистр SPH. Вместе они составляют один шестнадцатиразрядный указатель стека.
Перед началом работы в указатель стека необходимо записать адрес вершины стека. Это некий адрес ячейки ОЗУ, которая является старшей ячейкой области памяти, выделенной под стек. Определять размер стековой памяти и адрес ее вершины должен сам программист.
Для работы со стеком в системе команд микроконтроллера есть две специальные команды:
- команда записи в стек (push);
- команда извлечения из стека (pop).
Выполняя команду push, микроконтроллер записывает содержимое одного из РОН в ОЗУ по адресу, на который указывает указатель стека, а затем уменьшает значение указателя на единицу. Новая команда push запишет значение другого РОН в следующую ячейку ОЗУ. А указатель передвинется еще дальше. Таким образом происходит заполнение стека.
Выполняя команду pop, микроконтроллер сначала увеличивает содержимое указателя стека на единицу, а затем извлекает содержимое ячейки ОЗУ, на которое указывает указатель. Считанное значение помещается в один из РОН. В результате из стека считывается последнее записанное туда число. Следующая команда pop опять сначала увеличит указатель стека и прочитает предпоследнее записанное туда число. Благодаря регистру-указателю стека и описанному выше алгоритму реализуется полноценная стековая память.
Сразу после сброса микроконтроллера содержимое указателя стека равно нулю. Если оставить это содержимое без изменений, то все команды, связанные со стеком, работать не будут. Если нужно использовать стек в программе, то в самом ее начале необходимо записать в регистр-указатель стека значение его вершины.
Обычно вершину стека устанавливают равной адресу самой старшей ячейки ОЗУ. Кроме того, при составлении программы нужно следить, чтобы она не использовала в процессе своей работы область ОЗУ, выделенную для стека.
Одной из команд, активно использующих стековую память, является команда перехода к подпрограмме. При вызове подпрограммы текущий адрес из счетчика программ автоматически записывается в стек. При выходе из подпрограммы микроконтроллер извлекает адрес из стека и продолжает выполнение программы с этого адреса. Команда перехода к подпрограмме использует тот же самый стек, что и команды push и pop.
Это нужно обязательно учитывать при составлении программы. Если записать данные в стек, а затем перейти к подпрограмме, то в теле подпрограммы прочитать эти данные из стека будет уже невозможно. Если извлечь данные из стека, вместо записанных данных получится адрес возврата из подпрограммы, что сделает невозможным выход из подпрограммы, так как в стеке уже не будет адреса выхода.
Дата добавления: 2021-12-14; просмотров: 443;