while (X>0)
{ S }
Beg:
CMP X, 0
JLE Fin
S
JMP Beg
Fin: …
do
{ S }
while (X 0) S
; if (A > 0 || B > 0) S
CMP x, 0
JLE L
...
L:
; if (X = 0) S1 else S2
CMP A, 0
JG L1
CMP B, 0
JLE L2
L1: ...
; S
L2:
; if (A > 0 && B > 0) S
CMP X, 0
JE L1
...
JMP L2
L1:
L2:
CMP
JLE
CMP
JLE
...
L:
; S
; S1
; S2
59
A, 0
L
B, 0
L
; S
Ассемблер в примерах и задачах
; while (X > 0) do S
; do S while (X > 0)
L1: CMP X, 0
JLE L2
...
JMP L1
L2:
L:
; S
...
CMP X, 0
JG L
; S
5.5. КОМАНДЫ УПРАВЛЕНИЯ ЦИКЛОМ
5.5.1. Команда LOOP
Наиболее часто используемым является цикл с заранее
известным числом повторений тела цикла.
В качестве счетчика цикла обязательно использовать регистр
CX/ECX. Начальное значение для CX/ECX должно быть присвоено
до цикла.
Описать работу этой команды можно так:
CX = N
L:
… {тело цикла}
CX = CX - 1
if CX 0 then goto L
Тогда повторение N раз (N > 0) некоторой группы команд
(тело цикла) можно реализовать так:
MOV CX/ECX, N
L:
… {тело цикла}
LOOP L
Команда LOOP требует, чтобы в качестве счётчика цикла
использовался регистр CX/ECX. Собственно, команда LOOP
вычитает единицу именно из этого регистра, сравнивает
полученное значение с нулём и осуществляет переход на
указанную метку, если значение в регистре ECX больше 0. Метка
определяет смещение перехода, которое не может превышать 128
байт.
При использовании команды LOOP следует также учитывать,
что с её помощью реализуется цикл с постусловием,
60
Команды управления циклом
следовательно, тело цикла выполняется хотя бы один раз. Если до
начала цикла записать в регистр CX/ECX значение ≤ 0, то при
вычитании единицы, которое выполняется до сравнения с нулём,
в регистре CX/ECX окажется ненулевое значение, и цикл будет
выполняться 232 раз.
Команда LOOP не относится к самым быстрым командам. В
большинстве случаев её можно заменить последовательностью
других команд.
Поскольку команда LOOP ставится в конце цикла, то тело
цикла хотя бы раз обязательно выполнится. Поэтому для случая
EСХ = 0 наша схема цикла не подходит. Если возможен вариант,
когда число повторений может быть и нулевым, то при EСХ = 0
надо сделать обход цикла:
MOV
JECXZ
L:
…
LOOP
L1: …
ECX, N
L1
; ECX=0 -> L1;
; тело цикла
L
Для осуществления таких обходов в ПК была введена
команда условного перехода JECXZ. В иных ситуациях она
используется редко.
Рассмотрим пример использования команды LOOP.
Пример 9. Пусть X и Y – байтовые переменные со значением
от 0 до 6 и надо в регистр АХ записать степень Y числа X: АХ = XY
(отметим, что 66 = 46656 < 216).
Для решения этой задачи надо вначале положить АХ = 1, а
затем Y раз выполнить умножение AX = AX*X. При этом следует
учитывать, что при Y = 0 цикл не должен выполняться.
MOV АХ, 1
MOV CL, Y
MOV CH, 0
JCXZ L1
MOV SI, X
L: MOV DX, 0
MUL SI
LOOP L
; AX=1
; CX=Y как слово (счетчик цикла)
; При N=0 обойти цикл
; (DX,AX)=AX*X (DX=0)
61
Ассемблер в примерах и задачах
L1:
…
Другой пример использования оператора цикла в программе
— обработка последовательности чисел.
Пример 10. Дана последовательность из N чисел. Найти
сумму положительных чисел последовательности.
A
S
N
DW ?
DW 0
DW ?
MOV CX, N
; Ввод количества чисел N
L1: ; Ввод числа а
CMP A, 0
;если N / 2
EDX
N
0
; Если делитель = > N - составное
2
; Проверяем только нечетные
68
L02:
MOV F, 0
; Устанавливаем флаг в 0
L03:
}
cout
Последние комментарии
5 часов 55 минут назад
5 часов 55 минут назад
17 часов 18 минут назад
17 часов 19 минут назад
19 часов 21 минут назад
19 часов 23 минут назад