Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

2. Внутрисегментный переход

Если адресное расстояние между командой JMP METКА и меткой выходит за диапазон байта со знаком , то компилятор ассемблера формирует команду внутрисегментного перехода.

┌───────┐ ┌───────┐

│ KOП │ │ disp16│

└───────┘ └───────┘

Предположим, что адрес М2 равен 439Fh, а команда расположена по адресу 0023h.

Вычислим disp16.

1)P = IP +3=0323+3 =0326; длина команды 3 байта

2)адрес М2 439Fh

адрес команды -0326h

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

disp16 = 4079h

Рассмотрим алгоритм выполнения команды:

JMP M2

1)P = IP +3=0323+3 =0326; длина команды 3 байта

2)

IP = 0326h +

Disp=4079h

-----

439Fh = IP

Результат заносится в регистр IP – адрес метки M2.

Транслятор самостоятельно вычисляет смешение метки относительно следующей команды и в зависимости от значения формирует короткий или внутрисегментный переход. Записи команд короткого и внутрисегментного переходов одинаковые JMP M2. Для явного указания типа переходов используются указатели:

JMP near M2; внутрисегментный переход;

JMP short M2; короткий переход.

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

Используют только короткий переход (-128..127)

При выходе за диапазон выдается синтаксическая ошибка.

Аналог в Паскале:

if a=0 then goto met

1) CMP A,0 ; синтаксическая ошибка

JZ MET ; если адресное расстояние >127

2) иначе

CMP A,0

JNZ M1

JMP MET

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

Команды условных переходов делятся на:

- знаковые

- беззнаковые

- спец. назначения

Знаковые

┌─────────┬─────────────┬─────────────────────────────────────┐

│Переход │Флаги │ Примечания │

├─────────┼─────────────┼─────────────────────────────────────┤

│JE/JZ │ ZF │Если равно / Если ноль │

├─────────┼─────────────┼─────────────────────────────────────┤

│JNE/JNZ │ ┐ZF │Если не равно / Если не ноль │

├─────────┼─────────────┼─────────────────────────────────────┤

│JG/JNLE │┐ZF&(SF=OF) │Если > / Если не < и не равно │

├─────────┼─────────────┼─────────────────────────────────────┤

│JGE/JNL │ SF=OF │Если >= / Если не < │

├─────────┼─────────────┼─────────────────────────────────────┤

│JL/JNGE │ (SF<>OF) │Если < / Если не > и не равно │

├─────────┼─────────────┼─────────────────────────────────────┤

│JLE/JNG │ZF V (SF<>OF)│Если =< / Если не > │

└─────────┴─────────────┴─────────────────────────────────────┘

Беззнаковые

┌─────────┬────────────┬──────────────────────────────────────┐

│Переход │Флаги │ Примечания │

├─────────┼────────────┼──────────────────────────────────────┤

│JE/JZ │ ZF │Если равно / Если ноль │

├─────────┼────────────┼──────────────────────────────────────┤

│JNE/JNZ │ ┐ZF │Если не равно / Если не ноль │

├─────────┼────────────┼──────────────────────────────────────┤

│JA/JNBE │ ┐ZF & ┐CF │Если выше / Если не ниже и не равно │

├─────────┼────────────┼──────────────────────────────────────┤

│JAE/JNB │ ┐CF │Если выше или равно / Если не ниже │

├─────────┼────────────┼──────────────────────────────────────┤

│JB/JNAE │ CF │Если ниже / Если не выше и не равно │

├─────────┼────────────┼──────────────────────────────────────┤

│JBE/JNA │ CF V ZF │Если ниже или равно / Если не выше │

└─────────┴────────────┴──────────────────────────────────────┘