Организация разветвлений

Для организации разветвлений используются команды ус­ловных и безусловных переходов. Команды условного перехо­да имеют ограниченную область доступа -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. Даны три числа. Необходимо отсортировать их по возрастанию.