Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Ассемблеру.docx
Скачиваний:
12
Добавлен:
09.11.2018
Размер:
125.1 Кб
Скачать

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

Jmp <метка> Jmp r (или m)

Адрес команды, на которую делается переход r, m содержат «настоящий» адрес перехода

относительный (т.е. отсчитывается от команды перехода)

??? Jmp Z ???

Прямой переход по метке Z? Косвенный переход по адресу из ячейки Z?

Если Z описана до команды перехода, все ясно, если нет — Ассемблер считает, что Z – метка

Jmp Z Jmp Z Jmp Word PTR Z

- - - - - - - - - - - -

Z: Z DW L Z DW L

Условный переход = 1. Сравнение  установка соотв. Флагов

2. Переход (короткий  30 –40 команд)

  1. Команда сравнения

Cmp op1, op2

Аналог команды Sub, устанавливает флаги: ZF (ноль), SF(знак), CF(перенос), OF(переполнение)

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

Можно разделить на 3 группы:

А) Стоят после команды Cmp

Мнемокод

Условие

Флаги

        1. Для любых чисел

JE

op1=op2

ZF=1

JNE

op1<>op2

ZF=0

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

JL

op1<op2

SF<>OF

JLE

op1<=op2

SF<>OF или ZF=1

JG

op1>op2

SF=OF и ZF=1

JGE

op1>=op2

SF=OF

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

JB

op1<op2

CF=1

JBE

op1<=op2

CF=1 или ZF=1

JA

op1>op2

CF=0 и ZF=0

JAE

op1>=op2

CF=0

Б) Стоят после команд, отличных от Cmp

Мнемокод

Условие

Мнемокод

Условие

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

В) Проверка регистра СХ

JCXZ <метка>

If CX=0 then goto <метка>

Команды управления циклом

  • С помощью команд перехода можно реализовать любые разветвления и циклы:

А) If x>0 then S1 else S2

CMP X,0

JLE L2

JMP FIN

L2:

FIN:

B) While x>0 do S

BEG: CMP X,0

JLE FIN

JMP BEG

FIN:

C) Repeat S until x>0

BEG:

CMP X,0

JG BEG

S

S1

S

S2

  • Для организации цикла с заранее известным числом повторений можно использовать

команду LOOP, действие которой можно описать так:

1. В качестве счетчика — только регистр СХ;

2. Начальное значение СХ задавать до цикла;

3. Реализуется только короткий (30-40) переход;

4. При возможном СХ=0 надо выполнить обход цикла:

CX:=CX – 1; If CX<>0 Then goto <метка>

MOV CX, N

JCXZ L1

L:

LOOP L

L1:

Тело цикла

Пример Вычислить N! (N – байтовая, <=8) и результат записать в АХ. При N=0 цикл не должен выполняться.

Параметр цикла I можно менять и в обратном направлении, а т.к. именно так и меняется СХ, то его можно использовать не только как счетчик, но и как параметр:

MOV AX, 1

MOV CL, N

MOV CH, 0

JCXZ F1

MOV SI, 1

F: MUL CX

LOOP F

F1:

MOV AX, 1

MOV CL, N

MOV CH, 0

JCXZ F1

MOV SI, 1

F: MUL SI

INC SI

LOOP F

F1:

  • Для организации цикла с известным числом повторений, из которого возможен досрочный выход, используются команды:

LOOPE / LOOPZ

CX:=CX –1; if (CX<>0) and (ZF=1) then goto <метка>

Используется для поиска 1-го элемента последовательности, отличного от заданной величины

LOOPNE / LOOPNZ

CX:=CX –1; if (CX<>0) and (ZF=0) then goto <метка>

Используется для поиска элемента последовательности, имеющего заданную величину

Пример Записать в BL наименьшее число из [2, К], на которое не делится число N (K, N – байтовые переменные, 2<=K<N) или записать 0, если такого числа нет.

MOV DL, N

MOV DH, 0

MOV CL, K

MOV CH, 0

DEC CX

MOV BL, 1

DV: INC BL

MOV AX, DX

DIV BL

CMP AH, 0

LOOPE DV

JNE DV1

MOV BL, 0

DV1: