Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать

Безусловные переходы

Синтаксис безусловного перехода:

jmp [модификатор]<адрес перехода>

Адрес перехода – это метка или адрес области памяти (имя регистра), где находится указатель перехода.

Безусловные переходы могут быть выполнены как внутри сегмента, так и между сегментами.

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

Возможны варианты:

  • - прямой короткий;

  • - прямой;

  • - косвенный.

Прямой короткий внутрисегментный переход разрешает передавать управление только в определенном диапазоне, когда расстояние от адреса команды jmp до адреса перехода не превышает -128 или +127 байт.

Длина машинной команды при прямом коротком внутрисегментном переходе - 2 байта. Первый байт – код операции, второй - вычисляется транслятором как разность между значением смещения команды, следующей за jmp и значением адреса перехода.

Если метка расположена до команды jmp , то транслятор формирует короткую команду перехода, которая вычитает из счетчика команд разность между адресами.

Если метка расположена ниже команды jmp , то транслятор не может сам определить, что переход короткий. В этом случае используется модификатор short ptr. Команда перехода прибавит к показанию счетчика команд разность между адресами.

Примеры:

Метка выше команды

m1:

………..

30-40 команд

……….

jmp m1

………..

Метка ниже команды

jmp short ptr m1

…….

; 30-40 команд

……..

m1:

…….

Прямой внутрисегментный переход. Длина машинной команды - 3 байта, из которых 2 байта определяют диапазон адресов команд, на которые можно передать управление внутри сегмента. Это значит, команда позволяет передавать управление в пределах адресного пространства сегмента 64к.

Пример:

m1:

..

mov ax, bx

jmp m1

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

Примеры

Адрес метки записан в регистре

lea bx,m1

jmp bx

m1:

..

Адрес метки в области памяти

.code

……….

jmp addr ;косвенный переход на метку m1

m1:

mov ax,bx

…………

.data

addr dw m1 ; запись адреса метки в память

В сегменте данных выделено слово, в которое записывается адрес метки.

При косвенном переходе имеется возможность модификации указателя, что позволяет команде передавать управление на разные метки.

Пример

.data

addr dw m1

dw m2

.code

……..

mov si,0

jmp addr [si]

………..

mov si,2

jmp addr [si]

……….

m1:

………..

m2:

……….

Рассмотрим пример, когда следует применять модификатор при ближнем переходе.

.data

addr dw m1

…………..

.code

……..

lea si,addr

jmp near ptr [si]

………..

m1:

В данном примере адрес ячейки памяти с адресом метки передается транслятору неявно и он не может определить, какой следует выполнить переход – внутренний или внешний.D ‘njv ckexft

Межсегментные переходы

Прямой межсегментный переход.

Размер команды - 5 байт, из которых два байта составляют смещение в сегменте и два байта значение сегментной составляющей адреса.

Метки, которые участвуют в передаче управления, должны быть объявлены с помощью директивы label far.

Пример

Первый сегмент

seg1 segment

……………

jmp far ptr m2

m1 label far

seg1 ends

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]