Команды передачи управления
В группе команд передачи управления различают четыре типа команд: безусловные переходы, условные переходы, циклы и прерывания.
Команды безусловных переходов. Включают три мнемокода: JMP (безусловный переход), CALL (вызов подпрограммы) и RET (возврат из подпрограммы).
Команда JMP позволяет осуществить переход в любую точку программы, расположенную как в текущем программном сегменте, так и в другом сегменте. При переходе в пределах текущего программного сегмента используются первые три формата команды JMP.
Первый формат обеспечивает переход в произвольную точку программы внутри текущего программного сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разрядное смещение, старший разряд которого является знаковым. Второй, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на -128-f-127 адресов от команды JMP. Наконец, третий формат осуществляет загрузку указателя команд 16-разрядным числом, которое размещено по исполнительному адресу ЕА, определяемому постбайтом. Этот переход называется косвенным, так как используется косвенная адресация.
Для реализации безусловного перехода к точке программы, расположенной вне текущего программного сегмента, когда требуется перезагрузка сегментного регистра CS, используются четвертый и пятый форматы команды JMP.
Четвертый формат определяет прямой межсегментный переход, при котором во втором и третьем байтах формата указан относительный адрес точки перехода, а в четвертом и пятом байтах- новое значение CS. Пятый формат с помощью постбайта позволяет определить исполнительный адрес ЕА, по которому находится относительный адрес точки перехода (в байтах памяти с адресами ЕА, ЕА+1), и новое значение CS (в байтах памяти ЕА+2, ЕА+3).
Команда CALL позволяет вызвать подпрограмму, расположенную как в текущем программном сегменте, так и в другой области памяти. Она имеет такие же форматы, что и команда JMP, за исключением укороченного. В отличие от команды JMP аналогичного формата по команде CALL перед изменением значений IP или IP и CS происходит автоматическая запись в стек текущих значений этих регистров, что обеспечивает запоминание точки возврата из подпрограммы.
Для возврата из подпрограммы используется команда RET, под действием которой происходит передача управления по адресу возврата, занесенному в стек при выполнении предыдущей команды CALL. При возврате из подпрограмм, расположенных в текущем программном сегменте, применяются первые два формата команды RET, причем второй формат отличается от первого тем, что к содержимому указателя стека добавляется константа, записанная во 2-м и 3-м байтах команды. Это позволяет одновременно с возвратом из подпрограммы сбрасывать параметры, записанные в стек при выполнении этой подпрограммы и не используемые в дальнейшем.
Для межсегментного возврата применяются третий и четвертый форматы RET, которые обеспечивают восстановление содержимого как указателя команд, так и программного сегмента.
Команды условных переходов.Осуществляют передачу управления в зависимости от результатов предыдущих операций. Различают три разновидности условных переходов, которые используются для установления соотношений чисел со знаком, чисел без знака и произвольных чисел. В первых двух разновидностях для одних и тех же соотношений между числами выбираются различные мнемокоды команд, поскольку одним и тем же соотношениям чисел со знаком и чисел без знака соответствуют различные значения флагов.
В мнемокодах команд условных переходов при сравнении чисел со знаком для обозначения условия «больше» используется буква G (Greater - больше), а для обозначения - «меньше» буква L (Less - меньше). Для аналогичных условий при сравнении чисел без знака используются соответственно буквы A (Above- над) и В (Below - под). Условие равенства обозначается буквой Е (Equal - равно), а невыполнение некоторого условия - буквой N (Not - не). Следует отметить, что допускается исползование двух различных мнемокодов для каждой команды; например, мнемокоды JL и JNGF - эквивалентны, поскольку условия «меньше» и «не больше или равно» - идентичны.
Полный список мнемокодов команд, проверяемых условий, а также соответствующие булевские комбинации флагов и их значения приведен в табл. 1.4.
Таблица 1.4
Мнемокод команды | Условие | Значение флагов |
Для чисел со знаком | ||
JL/JNGE | Меньше/не больше или равно | SF + OF = l |
JNL/JGE | Не меньше/больше или равно | SF + OF = 0 |
JG/JNLE | Больше/не меньше или равно | (SF + OF) V ZF = 0 |
JNG/JLE | Не больше/меньше или равно Для чисел без знака | (SF + OF) V ZF = l |
JB/JNAE | Меньше/не больше или равно | CF = 1 |
JNB/JAE | Не меньше/больше или равно | CF = 0 |
JA/JNBE | Больше | CF V ZF = 0 |
JNA/JBE | Не больше Для прочих данных | CF V ZF = 1 |
JE/JZ | Равно/по нулю | ZF = 1 |
JNE/JNZ | Не равно/по нулю | ZF = 0 |
JS | По минусу | SF = 1 |
JNS | По плюсу | SF = 0 |
JO | По переполнению | OF = l |
JNO | По отсутствию переполнения | OF = 0 |
JP/JPE | По четному паритету | PF = 1 |
JNP/JPO | По нечетному паритету | PF = 0 |
Все команды условных переходов имеют одинаковый двухбайтовый формат, в первом байте которого задается код операции (КОП), а во втором - 8-разрядное смещение, которое рассматривается как число со знаком и, следовательно, позволяет осуществлять изменение адреса в диапазоне от -128 до +127. При необходимости более отдаленного («дальнего») перехода по выполнению условия используется дополнительно команда безусловного перехода.
Время выполнения каждой из команд условных переходов указано для двух случаев: 1) условие выполнено и управление действительно передается в соответствии со смещением, 2) условие не выполнено, так что управление передается следующей команде.
Команды организации циклов.Введены в ЦП для удобства выполнения вычислительных циклов. К ним относятся следующие мнемокоды: LOOP (цикл, пока (СХ) не равно 0), LOOPNZ/LOOPNE (цикл, пока не нуль/не равно), LOOPZ/LOOPE (цикл, пока нуль/равно) и JCXZ (переход по нулю в СХ). Каждая из этих команд имеет двухбайтовый формат, во втором байте которого указывается 8-разрядное смещение, используемое для организации перехода. Это смещение рассматривается как число со знаком и перед вычислением адреса перехода оно расширяется со знаком до 16 разрядов.
Используя команды циклов совместно с командами манипуляции элементами строк, можно составлять достаточно сложные программы преобразования строк. Рассмотрим пример составления программы для перевода строки данных, записанных в шестнадцатеричной системе счисления, в некоторый код, для которого перекодировочная таблица находится в памяти с начального адреса, указанного в ВХ, как это требуется для использования команды табличного преобразования кодов XLAT. Пусть далее исходная строка содержит 80 элементов и находится в памяти с относительного начального адреса 100, а строка-результат должна быть размещена с относительного адреса 200. Программа, выполняющая перекодировку исходной строки в строку-результат, при значении флага направления DF=0 будет иметь вид:
MOV SI ,100
MOV DI ,200
MOV СХ , 80
TRANSLATE: LODS
XLAT
STOS
LOOP TRANSLATE
Здесь использована команда табличного преобразования кодов XLAT, описанная в 1.2.
Команды прерывания.Включают три мнемокода: INT (прерывание), INTO (прерывание при переполнении) и IRET (возврат из прерывания).
Команда прерывания INT при v = 1 имеет двухбайтовый формат, второй байт которого содержит 8-разрядное число, определяющее тип (type) или уровень прерывания. По команде INT type процессор переходит к выполнению программы обслуживания прерывания указанного уровня, причем автоматически выполняются действия, необходимые для обеспечения возврата в точку прерывания. Эти действия состоят в следующем: содержимое регистра флагов F записывается в стек (PUSHF), сбрасываются флаги IF и TF, текущие значения регистра CS и указателя команд IP записываются в стек.
Для определения начального адреса программы обслуживания в соответствии со значением type используется таблица уровней прерывания. Для каждого из 256 уровней прерываний в этой таблице отведено по четыре байта: первые два байта определяют значение указателя команд IP, вторые - значение сегментного регистра CS. Эта четверка байтов определяет начальные адреса программ обслуживания (пары значений CS, IP), которые должны быть предварительно записаны в ячейки памяти по абсолютным адресам 0-3FFH. Адрес таблицы, соответствующий указанному в команде INT type уровню прерывания, определяется в ЦП следующим образом. После запоминания в стеке текущих значений CS и ГР осуществляются загрузки: CS = type x 4 + 2 и IP = type x 4. Новые значения CS и IP, взятые соответственно из ячеек с адресами type x 4 + 2 и type x 4, определяют начальный адрес требуемой программы обслуживания.
Рассмотренная выше команда прерывания INT при значении поля v = 0 имеет однобайтовый формат, т. е. не требует специального указания уровня прерывания. Эта команда автоматически воспринимается процессором как прерывание третьего уровня (type=3) и обычно используется в программах в качестве контрольной точки.
Команда прерывания при переполнении INTO вызывает переход на обслуживание прерывания четвертого уровня (type = 4) в случае, когда значение флага переполнения OF = 1. Команда INTO обычно используется после арифметических команд над числами со знаком. Обычно несколько первых уровней прерываний (до 32) резервируются под обработку ряда специфических ситуаций, таких, например, как попытка деления на нуль, переполнение и тому подобных.
Особенность обработки прерываний зарезервированных уровней состоит в том, что процессор переходит к их обслуживанию независимо от значения флага IF разрешения прерываний.
Однобайтовая команда IRET ставится в конце каждой программы обслуживания прерывания и обеспечивает возврат из прерывания. По этой команде процессор извлекает из стека значение указателя команд IP и программного сегмента CS, а также восстанавливает прежнее содержимое регистра флагов F (как и по команде POPF). При необходимости содержимое остальных регистров ЦП, соответствующее прерываемой программе, может быть запомнено в стеке при переходе на программу обслуживания и затем восстановлено при возврате из нее с помощью команд обращения к стеку.
Дата добавления: 2018-11-26; просмотров: 719;