Ассемблер в примерах и задачах [Наталья Юрьевна Добровольская] (pdf) читать постранично, страница - 15

-  Ассемблер в примерах и задачах  1.59 Мб, 136с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Наталья Юрьевна Добровольская - Олег Васильевич Гаркуша

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

1
L

; AХ>0 → L
; DX=1 → L

Для оператора
if (AX > 0) && (DX = 0) {
goto L
}

допустима такая последовательность команд:
CMP
JLE
CMP
JNE
JMP

AX,
M
DX,
M
L

0
; AХ0)
{ S1 }
else { S2 }
CMP X, 0
JLE L2
S1
JMP Fin
L2: S2
Fin: …

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