Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Тема 4.6 Программирование ветвлений




 

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

Признаком разветвляющегося алгоритма является наличие операций проверки условия. Различают два вида условий - простые и составные.

Простым условием (отношением) называется выражение, составленное из двух арифметических выражений или двух текстовых величин (иначе их еще называют операндами), связанных одним из знаков:

< - меньше, чем...

> - больше, чем...

< = - меньше, чем... или равно

> = - больше, чем... или равно

< > - не равно

= - равно

 

В общем случае полная форма конструкции условного оператора имеет вид:

if < логическое выражение> then < оператор 1> else < оператор 2>

 

if иф если
then зен то
else элс иначе

 

Условный оператор работает по следующему алгоритму.

Сначала вычисляется значение логического выражения, расположенного за служебным словом IF. Если его результат истина, выполняется < оператор 1>, расположенный после слова THEN, а действия после ELSE пропускаются; если результат ложь, то, наоборот, действия после слова THEN пропускаются, а после ELSE выполняется < оператор 2>.

Рассмотрим пример.

Задача.

Вывести на экран большее из двух данных чисел.

Var

x, y: integer; {вводимые числа}

Begin

writeln('Введите 2 числа '); {вводим два целых числа через пробел}

readln(x, y);

if x> y

then

writeln (x) {если х больше y, то выводим х}

else

writeln (y) {иначе выводим y}

End.

Можно также использовать и сокращенную (неполную) форму записи условного оператора.

Эта форма используется тогда, когда в случае невыполнения условия ничего делать не надо.

Неполная форма условного оператора имеет следующий вид.

if < логическое выражение>

then

< оператор>

Тогда если выражение, расположенное за служебным словом IF. в результате дает истину, выполняются действия после слова THEN, в противном случае эти действия пропускаются.

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

Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin... End называется составным оператором.

if < логическое выражение>

then

begin

оператор 1;

оператор 2;

...

end

else

begin

оператор 1;

оператор 2;

...

end;

Определение. Составной оператор - объединение нескольких операторов в одну группу. Группа операторов внутри составного оператора заключается в операторные скобки (begin-end).

begin

оператор 1;

оператор 2;

end;

Перед служебным словом Else разделитель (точка с запятой) не ставится.

 

38.               Команды условного и безусловного перехода.

 

Команда безусловного перехода имеет следующий синтаксис:

JMP < операнд>

Операнд указывает адрес перехода. Существует два способа указания этого адреса, соответственно различают прямой и косвенный переходы.

Прямой переход

Если в команде перехода указывается метка команды, на которую надо перейти, то переход называется прямым.

jmp L

...

...

L: mov eax, x

Косвенный переход

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

jmp ebx

Команды условного перехода

В системе команд процессора архитектуры x86 не предусмотрена поддержка условных логических структур, характерных для языков высокого уровня. Однако на языке ассемблера с помощью набора команд сравнения и условного перехода вы можете реализовать логическую структуру любой сложности. В языке высокого уровня любой условный оператор выполняется в два этапа. Сначала вычисляется значение условного выражения, а затем, в зависимости от его результата, выполняются те или иные действия. Проводя аналогию с языком ассемблера, можно сказать, что сначала выполняются такие команды, как CMP, AND или SUB, влияющие на флаги состояния процессора. Затем выполняется команда условного перехода, которая анализирует значение нужных флагов, и в случае если они установлены, выполняют переход по указанному адресу.

Что касается команд условного перехода, то их достаточно много, но все они записываются единообразно:

Jxx < метка>

Все команды условного перехода можно разделить на три группы.

В первую группу входят команды, которые обычно ставятся после команды сравнения. В их мнемокодах указывается тот результат сравнения, при котором надо делать переход.

 

Мнемокод Название Условие перехода после команды CMP op1, op2 Значения флагов Примечание
JE Переход если равно op1 = op2 ZF = 1

Для всех чисел

JNE Переход если не равно op1 ≠ op2 ZF = 0
JL/JNGE Переход если меньше op1 < op2 SF ≠ OF

Для чисел со знаком

JLE/JNG Переход если меньше или равно op1 ≤ op2 SF ≠ OF или ZF = 1
JG/JNLE Переход если больше op1 > op2 SF = OF и ZF = 0
JGE/JNL Переход если больше или равно op1 ≥ op2 SF = OF
JB/JNAE Переход если ниже op1 < op2 CF = 1

Для чисел без знака

JBE/JNA Переход если ниже или равно op1 ≤ op2 CF = 1 или ZF = 1
JA/JNBE Переход если выше op1 > op2 CF = 0 и ZF = 0
JAE/JNB Переход если выше или равно op1 ≥ op2 CF = 0

Во вторую группу команд условного перехода входят те, которые обычно ставятся после команд, отличных от команды сравнения, и которые реагируют на то или иное значение какого-либо флага.

Мнемокод Условие перехода Мнемокод Условие перехода
JZ ZF = 1 JNZ ZF = 0
JS SF = 1 JNS SF = 0
JC CF = 1 JNC CF = 0
JO OF = 1 JNO OF = 0
JP PF = 1 JNP PF = 0

И, наконец, в третью группу входят две команды условного перехода, проверяющие не флаги, а значение регистра ECX или CX:

JCXZ < метка> ; Переход, если значение регистра CX равно 0

JECXZ < метка> ; Переход, если значение регистра ECX равно 0

Однако эта команда выполняется достаточно долго. Выгоднее провести сравнение с нулём и использовать обычную команду условного перехода.

 

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...