Команды передачи управления микроконтроллера 8051
Группа представлена командами безусловного и условного переходов, командами вызова подпрограмм и командами возврата из подпрограмм (табл. 3.8).
Команды передачи управления
Таблица 3.8
Название команды | Мнемокод | Т | Б | Ц | Операция |
Длинный переход в полном объеме ПП | LJMP ad16 | PC ad16 | |||
Абсолютный переход внутри страницы в 2 Кб | AJMP ad11 | PC (PC) + 2, PC0-10 ad11 | |||
Короткий относительный переход внутри страницы в 256 байт | SJMP rel | PC (PC) + 2, PC (PC) +rel | |||
Косвенный относительный переход | JMP @A+DPTR | PC (A) + (DPTR) | |||
Переход, если аккумулятор равен нулю | JZ rel | PC(PC)+2, если (A)=0, то PC(PC)+rel | |||
Переход, если аккумулятор не равен нулю | JNZ rel | PC(PC)+2, если (A)≠0, то PC(PC)+rel | |||
Переход, если перенос равен единице | JC rel | PC(PC)+2, если (С)=1, то PC(PC)+rel | |||
Переход, если перенос равен нулю | JNC rel | PC(PC)+2, если (С)=0, то PC(PC)+rel | |||
Переход, если бит равен единице | JB bit, rel | PC(PC)+3, если (b)=l, то PC(PC)+rel | |||
Переход, если бит равен нулю | JNB bit, rel | PC(PC)+3, если (b)=0, то PC(PC)+rel | |||
Переход, если бит установлен, с последующим сбросом бита | JBC bit, rel | PC (PC) + 3, если (b)=1, то b 0 и PC (PC) + rel | |||
Декремент регистра и переход, если не нуль | DJNZ Rn, rel | PC (PC) + 2, Rn (Rn) - 1, если (Rn) ≠ 0, то PC (PC) + rel | |||
Декремент прямоадресуемого байта и переход, если не нуль | DJNZ ad, rel | PC (PC) + 2, ad (ad) - 1, если (ad) ≠ 0, то PC (PC) + rel | |||
Сравнение аккумулятора с прямоадресуемым байтом и переход, если не равно | CJNE A, ad, rel | PC (PC) + 3, если (A) ≠ (ad), то PC (PC) + rel, если (A) < (ad), то C 1, иначе C 0 | |||
Сравнение аккумулятора с константой и переход, если не равно | CJNE A, #d, rel | PC (PC) + 3, если ≠ #d, то PC (PC) + rel, если (A) < #d, то C 1, иначе С0 | |||
Сравнение регистра с константой и переход, если не равно | CJNE Rn, #d, rel | PC (PC) + 3, если Rn ≠ #d, то PC (PC) + rel, если (Rn) < #d, то C 1, иначе С0 | |||
Сравнение байта в РПД с константой и переход, если не равно | CJNE @Ri,#d,rel | PC (PC) + 3, если ((Ri)) ≠ #d, то PC (PC) + rel, если ((Ri)) < #d, то C 1, иначе C0 | |||
Длинный вызов подпрограммы | LCALL adl6 | PC (PC) + 3, SP (SP) +1, (SP) (PC0…7), SP (SP) + 1, (SP) (PC8…15), PC ad16 | |||
Абсолютный вызов подпрограммы в пределах страницы в 2 Кб | ACALL ad11 | PC (PC) + 2, SP (SP) + 1, (SP) (PC0…7), SP (SP) + 1, (SP) (PC8…15), PC0-10 ad11 | |||
Возврат из подпрограммы | RET | PC8…15 ((SP)), SP (SP) - 1, PC0…7 ((SP)), SP (SP) – 1 | |||
Возврат из подпрограммы обработки прерывания | RETI | PC8…15 ((SP)), SP (SP) - 1, PC0…7 ((SP)), SP (SP) – 1 | |||
Пустая операция | NOP | PC (PC) + 1 |
Команда безусловного перехода LJMP (L – long – длинный) осуществляет переход по абсолютному 16-битному адресу, указанному в теле команды, т. е. команда обеспечивает переход в любую точку памяти программ.
Действие команды AJMP (А – absolute – абсолютный) аналогично команде LJMP, однако в теле команды указаны лишь 11 младших разрядов адреса. Поэтому переход осуществляется в пределах страницы размером 2Кб, при этом надо иметь в виду, что сначала содержимое счетчика команд увеличивается на 2 и только потом заменяются 11 разрядов адреса.
В отличие от предыдущих команд, в команде SJMP (S – short – короткий) указан не абсолютный, а относительный адрес перехода. Величина смещения reI рассматривается как число со знаком, а, следовательно, переход возможен в пределах – 128...+127 байт относительно адреса команды, следующей за командой SJMP.
Команда косвенного перехода JMP @A+DPTR позволяет вычислять адрес перехода в процессе выполнения самой программы.
Командами условного перехода можно проверять следующие условия:
· JZ — аккумулятор содержит нулевое значение;
· JNZ — аккумулятор содержит не нулевое значение
· JC — бит переноса С установлен;
· JNC — бит переноса С не установлен;
· JB — прямо адресуемый бит равен 1
· JNB — прямо адресуемый бит равен 0;
· JBC — прямо адресуемый бит равен 1 и сбрасывается в нулевое значение при выполнении команды.
Все команды условного перехода рассматриваемых микро-ЭВМ содержат короткий относительный адрес, т. е. переход может осуществляться в пределах—128... +127 байт относительно следующей команды.
Команда DJNZ предназначена для организации программных циклов. Регистр Rn или байт по адресу ad, указанные в теле команды, содержат счетчик повторений цикла, а смещение rеl — относительный адрес перехода к началу цикла. При выполнении команды содержимое счетчика уменьшается на 1 и проверяется на 0. Если значение содержимого счетчика не равно 0, то осуществляется переход на начало цикла, в противном случае выполняется следующая команда.
Команда CJN удобна для реализации процедур ожидания внешних событий. В теле команды указаны "координаты" двух байт и относительный адрес перехода rel. В качестве двух байт могут быть использованы, например, значения содержимого аккумулятора и прямо адресуемого байта или косвенно адресуемого байта и константы. При выполнении команды значения указанных двух байт сравниваются и в случае, если они не одинаковы, осуществляется переход. Например, команда
WAIT: CJNE A, P0, WAIT
будет выполняться до тех пор, пока значения на линиях порта P0 не совпадут со значениями содержимого аккумулятора. В синтаксисе языка ASM её можно записать короче:
CJNE A, P0, $
Действие команд вызова процедур полностью аналогично действию команд безусловного перехода. Единственное отличие состоит в том, что они сохраняют в стеке адрес возврата.
Команда возврата из подпрограммы RET восстанавливает из стека значение содержимого счетчика команд, а команда возврата из процедуры обработки прерывания RETI, кроме того, разрешает прерывание обслуженного уровня. Команды RET и RETI не различают, какой командой – LCALL или ACALL – была вызвана подпрограмма, так как и в том, и в другом случае в стеке сохраняется полный 16-разрядный адрес возврата.
Все команды данной группы, за исключением CJNE и JBC, не оказывают воздействия на флаги. Команда CJNE устанавливает флаг C, если первый операнд оказывается меньше второго. Команда JBC сбрасывает флаг C в случае перехода.
В заключение следует отметить, что большинство Ассемблеров допускают обобщенную мнемонику JMP – для команд безусловного перехода и CALL – для команд вызова подпрограмм. Конкретный тип команды определяется Ассемблером, исходя из "длины" перехода или вызова.
Отладка программ
После того, как программные модули были успешно оттранслированы, размещены по конкретным адресам и связаны между собой, для отладки программы можно воспользоваться одним из методов, приведённых ниже:
· внутрисхемным эмулятором;
· встроенным программным отладчиком;
· внешним программным отладчиком;
· отлаживаемым устройством с записанным в память программ двоичным кодом программы.
Внутрисхемный эмулятор с отображением переменных языка программирования на дисплее компьютера оказывает значительную помощь при отладке программ непосредственно на разрабатываемой аппаратуре. Этот метод отладки предоставляет наиболее удобную среду, когда можно непосредственно в отлаживаемом устройстве останавливать программу, управлять выполнением программы непосредственно по исходному тексту программы, контролировать состояние внешних портов и внутренних переменных, как входящих в состав микросхемы, так и объявленных при написании исходного текста программы.