Группа команд передачи управления.

Данную группу образуют 19 команд передачи управления, из них две команды безусловного перехода, 14 команд условного перехода, команда вызова подпрограмм и две команды возврата из подпрограмм. В таб. 4 приводится описание команд передачи управления.

Таблица 4. Группа команд передачи управления

Название команды Мнемокод КОП Т Б Ц Операция
Безусповный переход JMP ad11 а10а9а800100 3 2 2 (PC0-10) = ad11, (PC11) = DBF
Косвенный переход в текущей странице ПП JMPP @A 1 1 2 (PC0-7) = ((A))
Декремент регистра и переход,если нe нуль DJNZ Rn,ad 11101rrr 4 2 2 (Rn) = (Rn) -1; если (Rn) не = 0, тo (PC0-7) = ad, иначе (PC)=(PC)+2
Переход, если перенос JC ad 4 2 2 Если (С) = 1, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход,если нет переноса JNC ad 4 2 2 Если (С) =0, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если аккумулятор содержит нуль JZ ad 4 2 2 Если (А) =0, то (РС0-7) = аd, иначе (PC)=(PC)+2
Переход, если аккумулятор содержит нe нуль JNZ ad 4 2 2 Если (А) ≠ 0, то (РС0-7) = аd, иначе (PC)=(PC)+2
Переход, если на входе Т0 высокий уровень JT0 ad 4 2 2 Если Т0=1, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если на входе Т0 низкий уровень JNT0 ad 4 2 2 Если Т0=0, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если на входе Т1 высокий уровень JT1 ad 4 2 2 Если Т1=1, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если на входеТ1 низкий уровень JNT1 ad 4 2 2 Если Т1=0, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если флаг F0 установлен JF0 ad 4 2 2 Если (F0) =1, то (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если флаг F1 установлен JF1 ad 4 2 2 Если (F1)=1, (РС0-7) = ad, иначе (PC)=(PC)+2
Переход, если флаг переполнения таймера установлен JTF ad 4 2 2 Если TF=1,то ТF = 0, (PC0-7) = ad, иначе (PC) = (PC) + 2
Переход, если на входе Группа команд передачи управления. - student2.ru низкий уровень JNI ad 4 2 2 Если Группа команд передачи управления. - student2.ru =0, то (РС0-7) = ad, иначе (PC)=(PC) + 2
Переход, если бит аккумулятора равен единице JBb ad bbb10010 4 2 2 Если (Вb) = 1, то (PC0-7)=ad, (b=0-7) иначе (PC) = (PC) + 2
Вызов подпрограммы CALL ad11 а10а9а810100 3 2 2 ((SP)) = (PC), (PSW4-7), (SP) = (SP) + 1, (PC11) = DBF, (РС0-10) = ad11
Возврат из подпрограммы RET 1 1 2 (SP) = (SP) -1, (PC) = ((SP))
Возврат из подпрограммы и восстановление ССП RETR 1 1 2 (SP) = (SP) - 1, (PC) = ( (SP) ), (PSW4-7) = ((SP))

Команды ветвления с прямой адресацией. В большинстве команд прямо указывается адрес перехода. В теле команды при этом содержится 8 (ad) или 11 (ad11) бит адреса перехода. Команда JMP позволяет передать управление в любое место 2048-байтного банка памяти программ (ПП). Номер банка ПП определяется флагом DBF, значение которого копируется в старший бит счетчика команд (РС11) при выполнении команды JMP или CALL. Для перехода из нулевого банка ПП в первый недостаточно только установить флаг DBF, необходимо также выполнить команду перехода JMP, которая изменит значение старшего бита счетчика команд.

Все остальные команды (кроме команд возврата) содержат только восемь младших бит адреса перехода. При этом оказывается возможным осуществить переход только в пределах одной страницы ПП (256 байт).

Если команда короткого перехода расположена на границе двух страниц (т. е. первый байт команды на одной странице, а второй – на следующей), то переход будет выполнен в пределах той страницы, где располагается второй байт команды. Для условного перехода с одной страницы на другую можно воспользоваться тандемом из команды условного перехода и длинного безусловного перехода (JMP).

Переход по косвенному адресу. Команда JMPP осуществляет переход по адресу, содержащемуся в ячейке ПП, на которую указывает содержимое аккумулятора. Таким образом, аккумулятор содержит адрес адреса перехода. Ячейка с адресом перехода должна находиться на той же странице ПП, что и команда перехода JMPP. Команда косвенного перехода обеспечивает простой доступ к таблице, содержащей векторы переходов по программе в зависимости от содержимого аккумулятора, что позволяет легко реализовать механизм множественных ветвлений.

Условные переходы. По командам условных переходов могут проверяться не только внутренние флаги, но и некоторые сигналы на внешних входах МК. Это позволяет эффективно выполнять ветвления в программе без использования процедуры предварительного ввода и последующего сравнения. Все команды условных переходов используют прямую короткую адресацию, что накладывает определенные ограничения на

размещение программ в памяти. Анализируемые признаки за исключением С и F0 не фиксируются в специальных триггерах флагов, а представляются мгновенными значениями сигналов в АЛУ или соответствующих входах МК.

Программные циклы. Для организации циклов удобно использовать команду DJNZ. Счетчик циклов организуется в одном из регистров текущего банка, для чего в этот регистр загружается число повторений цикла. При выполнении команды DJNZ производится декремент и последующая проверка на нуль содержимого регистра - счетчика циклов. Если его содержимое оказывается не нулевым, то происходит переход к

началу цикла, иначе - выход из цикла. Структура программы при этом будет следующей:

MOV RN, N ;инициализация счетчика циклов

LOOP : ... ;тело цикла

...

...

CYCLE: DJNZ RN, LOOP ;декремент RN, и переход, если не нуль

Следует отметить, что команды от метки LOOP до метки CYCLE включительно должны находиться в пределах одной страницы памяти программ.

Работа с подпрограммами.Для вызова подпрограмм существует команда CALL, позволяющая обратиться в любое место текущего банка ПП. При вызове подпрограммы в стеке запоминается адрес возврата и часть ССП. Глубина вложений подпрограмм ограничена емкостью стека (16 байт) и не должна превышать восьми.

Для возврата из подпрограммы необходимо выполнить команду RET, которая восстановит в счетчике команд адрес возврата. Для выхода из подпрограммы обработки прерывания служит команда RETR, которая кроме адреса возврата восстанавливает ССП и разрешает прерывания от данного источника.

При программировании МК необходимо внимательно отслеживать ситуацию вызова программы, находящейся в альтернативном (по отношению к текущему) банке ПП. В этом случае перед вызовом подпрограммы необходимо выбрать соответствующий банк памяти, а перед возвратом – восстановить старое значение DBF. Если в подпрограмме нет команды восстановления DBF, то возврат будет все же выполнен правильно (так как в стеке сохранен полный действительный адрес возврата), однако первая же команда длинного перехода передаст управление в альтернативный банк ПП. Если к подпрограмме производятся обращения из разных банков памяти, то оказывается затруднительно восстановить значение DBF перед возвратом. В этом случае можно рекомендовать использовать команду восстановления DBF в основной программе вслед за командой вызова. Обращаем внимание на указанные особенности как на возможный источник ошибок программирования. Пусть, например, требуется вызвать подпрограмму с именем SUBROUT, находящуюся в первом банке ПП, из программы, расположенной в нулевом банке ПП. Корректный вызов подпрограммы реализуется последовательностью

команд

SEL MB1 ;установка флага DBF

CALL SUBROUT ;вызов подпрограммы (после возврата

;из подпрограммы флаг DBF остается

;равным 1)

SEL MB0 ;восстановление DBF во избежание

;ошибочного перехода в банк 1

Наши рекомендации