Для организации разветвлений используются команды условных и безусловных переходов. Команды условного перехода имеют ограниченную область доступа -128..127 байт, т. е. разность между адресом очередной команды и адресом перехода должна быть в этом диапазоне.
Если необходимо перейти к команде вне области действия команды перехода, команда условного перехода комбинируется с командой безусловного перехода.
ПРИМЕР: Реализовать на ассемблере оператор
------------------------
if (х < 3) then x:=x+1;
x:=x-1;
-------------------------
Решение 1
-------------------------
mov ax,x;ax:=x
Cmp ax,3; сравнить x и 3
jge @metka;перейти на строчку metka если x>=3
inc ax; ax::=ax+1
@metka: dec ax; ax::=ax-1
-------------------------
Здесь metka - метка строки вне области действия оператора if.
Заметим, что команды inc (dec) используются вместо add (sub).
ПРИМЕР: Реализовать на ассемблере оператор
if (х < 3) goto mrtka
Предложенное выше решение НЕ ВЕРНО, транслятор сообщит об ошибке, если metka вне области действия оператора if.
Решение 2
-------------------------
mov ах,х; х=>ах
Сmр ах, 3; сравнить x и 3
jge @continue; if (x>=3) goto continue
jmp near ptr @metka; if (x<3) goto m
@continue:..
-------------------------
Решение ВЕРНО. Здесь используется команда безусловного перехода с префиксом near ptr. Префикс определяет область действия команды безусловного перехода и принимает значения:
short область действия-128..127 байт
near ptr область действия -32768..32767 байт
far ptr область действия распространяется на другие модули программы.
При использовании команд перехода необходимо правильно выбирать требуемые команды с учетом работы со знаковыми и беззнаковыми данными.
Таблица 3 Основные команды условного перехода.
Знаковые данные | Беззнаковые данные | Не зависят от типа |
jl (jnge) - меньше | jb (jnal) - ниже | je (jz) - paвно |
jg (jnle) - больше | ja (jnbe) - выше | jne (jnz) - нe равно |
jle (jng) - нe больше | jbe(jna) - нe выше | jo - переполнение |
jge (jnl) - нe меньше | jae(jnb) - нe ниже | jno - нет переполнения |
js отрицательное | jc - перенос | |
jns не отрицательное | jnc - нет переноса |
Примеры команд с использованием команд перехода.
ПРИМЕР 1: Вычислить z=max(x,y) с учетом знака чисел х, у
------------------------
Var
x,y,z:integer;
Begin
Read(x,y);
Asm
mov ах, х; aх: =х
Сmр ах, у; х сравнивается с у
jge @xgey;
mov ах, у; ax: =y
@xgey: mov z, ах; z:=ax
End;
writeln(‘max= ‘,z);
End.
------------------------
В этом примере xgey — метка с адресом перехода, если х >= у.
Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.
1. Дано квадратное уравнение a*x*x +b*x +c=0. Определить есть ли у него действительные корни.
2. Если x попадает в интервал (3..7), увеличить его в два раза иначе, уменьшить в два раза.
3. Дано квадратное уравнение a*x*x +b*x +c=0. Определить сколько у него действительных корней.
4. Даны три отрезка. Надо выяснит, можно ли из них построить треугольник.
5. Даны три числа. Найти наибольшее из них.
6. Дано двузначное число. Необходимо определить различны ли в нем цифры.
7. Дано трехзначное число. Необходимо определить все ли цифры в нем различны.
8. Дано четыре отрезка. Необходимо определить можно ли построить из них четырехугольник.
9. Дано четыре отрезка. Необходимо определить можно ли построить из них прямоугольный четырехугольник.
10. Дано три отрезка. Необходимо определить можно ли из них построить прямоугольный треугольник.
11. Даны три числа. Необходимо отсортировать их по возрастанию.