Команда безусловного перехода
Безусловный переход в программе на Ассемблере производится по команде JMP. Полный формат команды следующий:
JMP [модификатор] адрес_перехода.
Адрес перехода может быть либо меткой, либо адресом области памяти, в которую предварительно помещен указатель перехода.
В системе команд микропроцессора существуют несколько кодов машинных команд безусловного перехода. Их различия определяются дальностью перехода и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным или близким, а во втором случае – межсегментным или дальним.
Внутрисегментный переход предполагает, что изменяется только содержимое регистра IP. Можно выделить три варианта внутрисегментного перехода:
Прямой короткий внутрисегментный переход применяется, когда расстояние от команды JMP до адреса перехода не более чем –128: +127 байтов. В этом случае транслятор языка формирует машинную команду безусловного перехода длиной 2 байта 1 байт – код операции, 2-ой байт – смещение. В коде операции заложена информация о том, что 2-ой байт интерпретируется как смещение. Здесь нужно отметить одну особенность транслятора Ассемблера – он является однопроходным, иными словами, машинный код программы получается за один просмотр мнемокоманд от начала до конца. В связи с этим обстоятельством, если безусловный переход должен происходить на адрес до команды JMP, то транслятор может легко вычислить смещение. Если же переход короткий, но на метку после команды JMP, то транслятору нужно подсказать, что он должен сформировать команду безусловного короткого перехода. С этой целью в команде JMP используется модификатор SHORT PTR (полностью — SHORT POINTER или короткий указатель):
JMP SHORT PTR M1
. . . . . . не более 35-40 команд
Прямой внутрисегментный переход отличается от короткого тем, что длина машинной команды составляет 3 байта, в которой 2 последних байта интерпретируются как смещение. Нетрудно определить, что в этом варианте можно осуществлять переход в пределах 64 Кбайт памяти относительно следующей за JMP команды.
В приведенном в параграфе “команды условного перехода” фрагменте программы, наряду с командами условного перехода, присутствуют команды безусловного перехода, которые правильно надо было бы писать как
JMP SHORT PTR K.
Приведу этот фрагмент программы полностью с комментариями.
MOV AL,A ;сторону треугольника а записать в AL
MOV BL,B ;сторону треугольника в записать в ВL
MOV СL,С ;сторону треугольника с записать в СL
CMP AL,BL ;сравнить стороны а и b
JNE NOT_EQABC ;если стороны не равны, перейти к NOT_EQABC
CMP BL,CL ;если а=b, сравнить b и c
JNE NOT_EQABC ;если стороны не равны, перейти к NOT_EQABC
здесь поместить команды выдачи сообщения “треугольник равносторонний”
JMP SHORT PTR K ; переход на метку K
NOT_EQABC: CMP BL,CL ;а не равно b, сравнить b и c
JE EQUAL ; если стороны равны, перейти к EQUAL
CMP AL,CL ; если b не равно c,сравнить а и с
JE EQUAL ; если стороны равны, перейти к EQUAL
здесь поместить команды выдачи сообщения “треугольник обычный”
JMP SHORT PTR K ; переход на метку K
здесь поместить команды выдачи сообщения “треугольник равносторонний”
Если приведенный фрагмент сравнить с предыдущим, то можно видеть, что после метки NOT_EQABC пропущена проверка сторон а и в,поскольку на эту команду мы попадем в том случае, если а не равно в.
Косвенный внутрисегментный переход означает, что в команде JMP указывается не сам адрес перехода, а место, где этот адрес записан. Например:
DSEG SEGMENT PARA PUBLIC ‘DATA’
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
В командах косвенного внутрисегментного перехода рекомендуется применять модификатор NEAR, т.к. при косвенном переходе не всегда транслятору удается определить, находится адрес перехода в текущем сегменте кода или нет.
Команда прямого межсегментного перехода имеет длину 5 байт, из которых 2 байта составляет смещение адреса перехода, а другие 2 байта – значение сегментной составляющей (CS) того кодового сегмента, где находится адрес перехода. Например:
SEG1 SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:SEG1, DS:DSEG1, SS:STACK
SEG2 SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:SEG2, DS:DSEG2, SS:STACK
Во втором случае FAR необязательно, но если модификатор примените, то ошибки не будет. Необязательность объясняется тем, что метка находится раньше команды перехода и транслятор может самостоятельно определить, что переход является межсегментным.
Команда косвенного межсегментного перехода в качестве операнда имеет адрес области памяти, в которой содержится смещение и сегментная часть целевого адреса перехода.
DSEG SEGMENT PARA PUBLIC ‘DATA’
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
CS1 SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CS1, DS:DS1, SS:ST1
Одним из вариантов рассматриваемого перехода является косвенный регистровый межсегментный переход. Адрес перехода в этом варианте указывается в регистре, что удобно при программировании динамических переходов, когда конкретный адрес перехода определяется в процессе выполнения программы и помещается в регистр:
DSEG SEGMENT PARA PUBLIC ‘DATA’
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
JMP DWORD PTR [BX]
CS1 SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CS1, DS:DS1, SS:ST1
В двойное слово ADDR помещается смещение адреса и начало сегмента кода, включающего метку M1, в нашем случае, начало сегмента CS1.
Т.о. модификаторы SHORT PTR, NEAR PTR и WORD PTR применяют при организации внутрисегментных переходов, а FAR PTR и DWORD PTR – при межсегментных переходах.
Команды передачи управления
Дата добавления: 2015-06-12 ; просмотров: 4433 ; Нарушение авторских прав
В группе команд передачи управления различают четыре типа команд: безусловные переходы, условные переходы, циклы и прерывания.
Команды безусловных переходов. Включают три мнемокода: 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.
Команды условного и безусловного перехода
Команды микропроцессора.
Теперь остановимся подробнее на выполняемых командах. Весь набор команд любого микропроцессора можно разделить на несколько групп.
Первая группа —это команды перемещения данных.Повинуясь этим командам, процессор копирует содержимое одной ячейки памяти в другую, копирует информацию из ячейки памяти в один из внутренних регистров либо, наоборот, копирует содержимое регистра в одну из ячеек памяти. Кроме того, данные могут копироваться из одного внутреннего регистра в другой.
Следует заметить, что так называемые команды перемещения, по сути, не перемещают данные из ячейки в ячейку, а копируют эти данные. Операция перемещения в цифровой технике бессмысленна. В общепринятом понимании переместить означает убрать из одного места и поместить в другое. Но убрать данные из ячейки памяти невозможно!
Любой бит любой ячейки памяти всегда равен либо нулю, либо единице. То есть всегда содержит какое-либо число. Поэтому команды перемещения считывают байт данных из ячейки-источника и записывают их в ячейку-приемник. При этом в ячейке-источнике данные не изменяются.
Ко второйгруппе относятся команды преобразования данных.Именно в эту группу входят команды сложения, вычитания, логических преобразований, сдвига разрядов и т. д.
К третьей группе относятся команды передачи управления.Вот об этом классе команд я хотел бы поговорить подробнее. Сложно представить себе программу, состоящую лишь из одной последовательной цепочки команд. Подавляющее число алгоритмов требуют разветвления программы. Это значит, что программа должна уметь выполнять разные последовательности действий в зависимости от некоторого условия.
Пример.
Допустим, что наше микропроцессорное устройство имеет кнопки управления. При нажатии каждой кнопки должно выполняться свое определенное действие. Например, при нажатии одной кнопки исполнительный механизм должен повернуться влево. При нажатии другой — повернуться вправо и т. п. Для того, чтобы это было возможно, программа периодически считывает состояние кнопок. Затем программа должна оценить их состояние. Если нажата первая кнопка, выполняется некая последовательность команд, выдающая на соответствующий порт код, приводящий к включению двигателя в прямом направлении. Если нажата вторая кнопка, то выполняется другая последовательность команд, выдающая в тот же порт совсем другой код. Этот код должен вызвать включение двигателя в реверсном направлении.
Очевидно, что для реализации данного алгоритма придется прервать последовательное выполнение команд. Для того, чтобы программа имела возможность менять алгоритм своей работы в зависимости от какого-либо условия, в системе команд любого процессора обязательно имеются команды передачи управления. К командам передачи управления относятся следующие виды команд: команды условного перехода; команды безусловного перехода; команды перехода к подпрограмме; команды организации цикла. Рассмотрим все эти виды команд по порядку.
Команды условного и безусловного перехода
Оба этих вида команд предназначены для того, чтобы прерывать последовательное выполнение программы и вызывать так называемый переход.Причем условный переход происходит только при соблюдении какого-либо условия. Безусловный переход выполняется всегда, как только программа встретит соответствующую команду. В качестве условий перехода может выступать одно из следующих логических выражений:
♦ величина А равна величине В;
♦ величина А не равна величине В;
♦ величина А меньше величины В;
♦ величина А больше величины В;
♦ величина А меньше или равна величине В;
♦ величина А больше или равна величине В.
В качестве величин для сравнения может выступать содержимое любых внутренних регистров процессора, содержимое любых ячеек памяти или просто константы.
Пример.
Рассмотрим пример применения условного и безусловного переходов. Для наглядности изобразим цепочку команд в программной памяти в виде последовательности графических элементов (см. рис. 2.2). Ход выполнения программы показан при помощи стрелок. Квадратиками обозначены обычные команды (команды перемещения и команды преобразования данных). Кружочек с вопросом — это команда условного перехода. Скругленный элементе восклицательным знаком— это безусловный переход. Такая программа имеет две ветви. В случае, если условие есть ложь, выполняется ветвь номер 1. В случае, если условие — истина, выполняется ветвь номер 2.
Допустим, что условный переход производит сравнение кода нажатой клавиши с некоторой константой. Тогда действие, выполняемое условным оператором, можно записать так: «Если код нажатой клавиши равен 0, перейти к выполнению ветви номер 2». Соответственно, в случае невыполнения условия (например, считанное число равно 1), программа продолжит свою работу в обычном режиме и перейдет, таким образом, к выполнению ветви номер 1.
В конце ветви номер 1 стоит оператор безусловного перехода. Он служит для того, чтобы программа не начала выполнять ветвь номер 2 сразу после выполнения ветви номер 1. В данном случае выполнение перехода обязательно и никакого условия не требуется.
Технически переход выполняется путем записи в регистр адреса нового значения. Изменение значения регистра адреса возможно только при помощи команд передачи управления.
Источники:
http://studopedia.ru/8_179768_komanda-bezuslovnogo-perehoda.html
http://life-prog.ru/2_16634_komandi-peredachi-upravleniya.html
http://helpiks.org/9-32942.html