Команды переходов.

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

 

 

Команды переходов без возврата делятся на две группы:

• команды безусловных переходов;

• команды условных переходов.

В обозначениях этих команд используются слова Branch (ветвление) и Jump (прыжок).

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

Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно вы­ступают значения флагов в регистре состояния процессора (PSW). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Всего таких условий перехода может быть от 4 до 16. Несколько примеров команд условных переходов:

• переход, если равно нулю;

• переход, если не равно нулю;

• переход, если есть переполнение;

• переход, если нет переполнения;

• переход, если больше нуля;

• переход, если меньше или равно нулю.

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

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

Совместное использование нескольких команд условных и безуслов­ных переходов позволяет процессору выполнять разветвленные алгорит­мы любой сложности. Для примера на рис. 3.13 показано разветвление программы на две ветки с последующим соединением, а на рис. 3.14 — разветвление на три ветки с последующим соединением.


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

Программа 1 Программа 2

Рис. 3.13.Реализация разветвления на две ветки.

 


Память

Рис. 3.14.Реализация разветвления на три ветки.

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

Для обратного возврата в точку вызова подпрограммы (точку перехода) используется специальная команда возврата (RET или RTS). Эта команда извлекает из стека значение адреса команды перехода и записывает его в регистр-счетчик команд.

Особое место среди команд перехода с возвратом занимают команды прерываний (распространенное название — INT). Эти команды в каче­стве входного операнда требуют номер прерывания (адрес вектора). Об­служивание таких переходов осуществляется точно так же, как и аппарат­ных прерываний. То есть для выполнения данного перехода процессор обращается к таблице векторов прерываний и получает из нее по номеру прерывания адрес памяти, в который ему необходимо перейти. Адрес вы­зова прерывания и содержимое регистра состояния процессора (PSW) со­храняются в стеке. Сохранение PSW — важное отличие команд прерыва­ния от команд переходов с возвратом.

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

Для возврата из подпрограммы, вызванной командой прерывания, ис­пользуется команда возврата из прерывания (IRET или RTI). Эта команда извлекает из стека сохраненное там значение счетчика команд и регистра состояния процессора (PSW).

Отметим, что у некоторых процессоров предусмотрены также команды условных прерываний, например, команда прерывания при переполнении.

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