Команды условных и безусловных переходов
Безусловный переход – указание микроконтроллеру продолжить выполнение программы по указанному адресу. Существует видов безусловных переходов, различающихся по способу указания данного адреса:
Условный переход — команда микроконтроллеру на изменение порядка выполнения программы в соответствии с результатом проверки некоторого условия. Наиболее часто условный переход имеет две стадии: на первой происходит сравнение между собой некоторых величин, определяющих условие перехода, на второй выполняется сам переход. Условные переходы могут быть реализованы двумя способами. Переход меняет значение счётчика команд процессора на вычисленное значение адреса перехода. Пропуск дополнительно увеличивает значение счётчика команд на число, равное длине следующей команды, для пропуска команды. В микроконтроллерах архитектуры AVR применяется две команды условного перехода BRBC, BRBS, пять команд пропуска по условию CPSE, SBRC, SBRS, SBIC, SBIS и четыре вспомогательных команды расчета условия CP, CPC, CPI, TST. При написании программ, команды безусловного, условного переходов и вызова подпрограмм могут ссылаться на метки, вместо которых компилятор подставляет соответствующее рассчитанное значение адреса перехода или смещения. Ограничения команд на расстояние переходов указаны в документации. Стек Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (англ. Last In — First Out, «последним пришёл — первым вышел»). Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкивание (pop), возможно также только из вершины стека, при этом, второй сверху элемент становится верхним. Стеки широко применяются в вычислительной технике — в частности, для отслеживания точек возврата из подпрограмм используется стек вызовов, который является неотъемлемой частью архитектуры большинства современных процессоров. В микропроцессорах AVR стек располагается в области оперативной памяти, адрес стека содержится в паре регистров ввода-вывода SPL и SPH (младший и старший байты соответственно). Старший байт SPH (разряды SP8...SP15) находится в памяти по адресу $ЗЕ ($5Е), а младший байт SPL (разряды SP0...SP7) - по адресу $3D ($5D). Число фактически используемых разрядов зависит от типа микроконтроллера. У некоторых AVR-микроконтроллеров область памяти данных настолько мала, что достаточно только регистра SPL. В этом случае регистр SPH отсутствует. Указатель стека после подачи сигнала сброса устанавливается в "0". Он доступен для чтения и записи. Регистры указателя стека указывает на вершину стека. Обратите внимание на организацию стека, который направляется от старших в более младшие позиции статического ОЗУ. Это означает, что команда помещения в стек PUSH уменьшает значение указателя стека. Указатель стека указывает на область стека в статическом ОЗУ данных, где размещены стеки прерываний и подпрограммы. Данная область стека в статическом ОЗУ памяти данных должна быть определена программно до вызова любой процедуры или разрешения прерываний. Устанавливаемое значение указателя стека должно быть более 0x60. Указатель стека однократно декрементируется при помещении данных в стек инструкцией PUSH и дважды декрементируется при помещении в стек адреса возврата при вызове подпрограмм или прерываниях. Указатель стека однократно инкрементируется при извлечении данных из стека инструкцией POP и дважды инкрементируется при извлечении адреса возврата при выполнении инструкции выхода из подпрограммы RET или выхода из процедуры обработки прерываний RETI. В подключаемых файлах описаний регистров микроконтроллеров, размер SRAM определен как RAMEND. Поэтому для установки указателя стека в конец SRAM используется следующая последовательность команд:
Когда байт помещается в стек, то он записывается по адресу, на который сейчас ссылается указатель стека, после чего указатель стека декрементируется на 1. Когда байт с извлекается из стека, то сначала указатель стека инкрементируется на 1, а затем байт, извлеченный по соответствующему адресу, копируется в регистр назначения. В случае вызова подпрограммы в стек заносится только адрес возврата, поэтому при необходимости сохранения значений регистров общего назначения и флагов состояния, их следует занести в стек в начале выполнения подпрограммы и вернуть в конце.
|