Вопрос 23
Операторы цикла в ассемблере:
Цикл с предусловием while
Цикл с постусловием do-while
Итерационный цикл for
Оператор цикла с предусловием while
Оператор цикла с предусловием while имеет следующий формат:
На ассемблере это может выглядеть так:
while_begin:
cmp al,1; вычисление логического значения "выражение-условие"
jne end_while; ЕСЛИ не равно ТО ПЕРЕЙТИ НА end_while
. . .
;что-то делаем — тело цикла
. . .
jmp while_begin ;переход на начало очередной итерации цикла
end_while: ;конец цикла
;... ;продолжение программы
Операторы continue и break
Прекращение выполнения цикла возможно в двух случаях:
значение выражение-условие равно FALSE;
имеет место безусловная передача управления за пределы цикла (в программе на языках С и С++ эти действия выполняют операторы break и goto).
В языках С и С++ изменить последовательность выполнения тела цикла можно с помощью оператора continue.
Алгоритм выполнения операторов break, goto и continue прост, они передают управление в определенную точку программы:
break — сразу йа конец цикла;
goto — в произвольное место программы;
continue — на начало последнего открытого оператора while, do или for.
В программе на ассемблере естественнее всего реализовать эти операторы с помощью команды безусловного перехода JMP, которая передаст управление в нужную точку программы.
Оператор цикла с постусловием do-while
Оператор цикла с постусловием do-while. Его формат в нотации языков С и С++:
do
тело цикла
while (выражение условие)
Основная отличительная особенность данного оператора — в том, что операторы, составляющие тело цикла, выполняются хотя бы один раз. Близкий к нотации ассемблера псевдокод реализации этого оператора выглядит так:
do_while_begin: операторы цикла
. . .
;вычисление логического значения "выражение-условие"
ЕСЛИ “выражение-условие"=FALSE ТО ПЕРЕЙТИ НА end_while
ПЕРЕЙТИ на do_while_begin: ; переход на начало очередной итерации цикла
end_while: ; конец цикла
;... ;продолжение программы
Оператор итерационного цикла for
Оператор итерационного цикла for — это единственный оператор цикла, хотя бы частично поддерживаемый ассемблером на уровне команд. Его формат в нотации языков С и С++:
For (инициализация цикла; выражение-условие; выражение) тело цикла
С точки зрения грамматики все три выражения в операторе for являются произвольными. Но обычно первое из них (инициализация цикла) предназначено для присвоения начального значения переменной цикла, второе (выражение-условие) вычисляет логическое значение для принятия решения о выходе из цикла, третье (выражение) вычисляет значение переменной цикла на очередной его итерации.
Ассемблер с помощью команды LOOP поддерживает только один вариант организации такого цикла, который был подробно рассмотрен в предыдущей главе. Для реализации произвольного варианта цикла for может оказаться полезным следующий псевдокод:
Инициализация переменной цикла
For_begin:
;вычисление логического значении «выражение-условие»
ЕСЛИ «выражение-условие»=FALCE TO ПЕРЕЙТИ НА end_for
. . .
Вычисляем выражение – очередное значение переменной цикла
ПЕРЕЙТИ на for_begin: ;переход на начало очередной итерации цикла
End_for: ;конец цикла
. . . ;продолжение программы
Эффективнее тот цикл в котором меньше проверок и переходов.
