Управляющие команды

Описание управляющих команд начнем с команд условного перехода. Эти команды используют только относительный способ адресации, поэтому для них будем использовать условное обозначение адреса пере­хода rel. Для каждого условия существует пара команд, одна из которых осуществляет передачу управления при его соблюдении, а другая — при несоблюдении. В поле комментариев приводятся расшифровки мнемоники этих команд. Условием передачи управления может быть равенство или неравенство нулю содержимого регистра накопителя:

JZ rel;Jump if Zero

JNZ rel; Jump if No Zero

Можно также использовать в качестве условия перехода равенство бита переноса единице или нулю;

JC rel;Jump if Carry

JNC rel;Jump if Not Carry

Существуют команды, которые используют в качестве условия перехода равенство единице или нулю содержимого любого бита в функциональном регистре или адресуемого бита в ОЗУ:

JB flag, rel; Jump if Bit

JNB flag, rel;Jump if no Bit

Команда передачи управления по равенству бита единице имеет вариант

с очисткой содержимого этого бита:

JBC flag, rel;Jump if Bit and Clear

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

Перечисленные команды осуществляют переход в зависимости от результатов предыдущих вычислений. Однако есть управляющие команды, которые сами осуществляют вычисления для получения условий передачи управления. Мнемокод первой из таких команд - CJNE (Compare and Jump if Not Equal означает «сравнить и перейти, если не равно»). Это единственная команда микроконтроллера, имеющая 3 операнда. Ее четыре разновидности отличаются способами адресации источника и приемника:

CJNE A, src, rel

CJNE A, #src, rel

CJNE Rn, #src, rel

CJNE @Ri, #src, rel

Команда вычисляет разность первого и второго операндов, но результат вычитания никуда не записывается, за исключением бита переноса. Передача управления по указанному адресу осуществляется при неравенстве операндов. При сравнении положительных чисел бит переноса устанав­ливается в 1, если первый операнд меньше второго. Если по адресу перехода записать команду передачи управления по содержимому бита переноса, то в результате одного сравнения можно выполнить три разных блока программы.

Другая команда — DJNZ (Decrement and Jump if Not Zero) означает «уменьшить и перейти, если не равно нулю», уменьшает содержимое первого операнда на единицу. Бели операнд не равен 0, то управление передастся тто указанному адресу:

DJNZ Rn, rel

DJNZ dst, rel

Эта команда удобна для программирования цикла по счетчику. Перед началом цикла по адресу приемника надо записать число, равное количеству повторений цикла. Если во втором операнде записать адрес начала цикла и не изменять содержимое первого операнда другими командами в цикле, то заданный участок программы будет повторен заданное количество раз.

Перейдем к командам безусловного перехода JuMP без возврата. Они используют адресацию всех трех дальностей:

SJMP rel

AJMP adr11

LJMP adr16

Цифры в условных обозначениях операндов последних двух команд указывают на количество разрядов адресной части их кодов.

Команда безусловного перехода с индексной адресацией позволяет изменять адрес перехода по содержимому накопителя:

JMP @A+DPTR

При помощи этой команды можно осуществлять переходы по любому из 256 адресов относительно содержимого регистра указателя. Поскольку адрес передачи управления зависит от содержимого накопителя, этот вариант команды безусловной передачи управления, по сути дела, не является таковым. Эта команда может использоваться как переключатель, если в заданной области программы записать команды безусловного перехода на некоторые блоки программы. Так как эти команды будут занимать более одного байта, рассматриваемая команда может использо­ваться для передачи управления не более чем по 128 адресам.

Мнемоника команд безусловного перехода с возвратом CALL пере­водится как вызов. Эти команды не используют короткую адресацию:

ACALL adr11

LCALL adr16

Они применяются для вызова подпрограмм, после выполнения, которых управление должно возвращаться команде, следующей за командой вызова. Для этой цели перед занесением адресной части команды вызова в про­граммный счетчик его старое значение записывается в два байта ОЗУ, адресуемые указателем стека. Сначала в стек заносится младший байт программного счетчика, а затем старший байт. Эта запись производится автоматически без использования каких-либо дополнительных команд.

Для корректного возврата к вызывающей программе последней вы­полняемой командой подпрограммы должна быть

RET

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

Другая команда, работающая точно таким же образом,

RETI

применяется для возврата к программе, выполнявшейся в момент аппарат­ного прерывания. Буква I в ее мнемокоде соответствует слову Interrupt (прерывание). Аппаратные прерывания передают управление фиксиро­ванным адресам с запоминанием адреса возврата. Программист должен разрабатывать программы обработки аппаратных прерываний по тем же правилам, что и подпрограммы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: