Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы 20,22,23.docx
Скачиваний:
10
Добавлен:
01.04.2025
Размер:
44 Кб
Скачать
☆

Вопрос 23

Операторы цикла в ассемблере:

  1. Цикл с предусловием while

  2. Цикл с постусловием do-while

  3. Итерационный цикл for

Оператор цикла с предусловием while

Оператор цикла с предусловием while имеет следующий формат:

На ассемблере это может выглядеть так:

while_begin:

cmp al,1; вычисление логического значения "выражение-условие"

jne end_while; ЕСЛИ не равно ТО ПЕРЕЙТИ НА end_while

. . .

;что-то делаем — тело цикла

. . .

jmp while_begin ;переход на начало очередной итерации цикла

end_while: ;конец цикла

;... ;продолжение программы

Операторы continue и break

Прекращение выполнения цикла возможно в двух случаях:

  1. значение выражение-условие равно FALSE;

  2. имеет место безусловная передача управления за пределы цикла (в программе на языках С и С++ эти действия выполняют операторы 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: ;конец цикла

. . . ;продолжение программы

Эффективнее тот цикл в котором меньше проверок и переходов.