Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.5.2. Операторы безусловных переходов

Такой оператор заставляет ЦП извлечь новую команду не из следующей ячейки ОП, а из какой-то другой, известной еще до начала выполнения программы. Существуют пять машинных команд безусловных переходов. Все они имеют одну и ту же ассемблерную мнемонику jmp и один операнд. Это:

1) внутрисегментный прямой короткий переход;

2) внутрисегментный прямой переход;

3) внутрисегментный косвенный переход;

4) межсегментный прямой переход;

5) межсегментный косвенный переход.

Во внутрисегментном переходе оператор перехода находится в том же сегменте памяти, что и оператор, на который делается переход. А в межсегментном переходе – в разных сегментах. В операторах прямого перехода операндом является метка того оператора, на который делается переход. При внутрисегментном переходе данная метка имеет тип near (близкий). При межсегментном переходе метка перехода имеет тип far (дальний).

Внутрисегментный прямой короткий переход используется для переходов от +127 до –128 байтов. Команда перехода имеет длину 2 байта. В первом байте КОП, а во втором число со знаком, представляющее собой «расстояние» до искомого оператора. Это число идентично соответствующему числу в операторе условного перехода.

Для указания транслятору, что переход короткий, используется слово short. Например:

jmp            short   .A90

                 .   .   .   .   .   .   .   .   .   .

.А90:

 

В ассемблере NASM по умолчанию прыжок короткий. Поэтому, если не задано другое значение, слово short обычно опускается.

Внутрисегментный прямой переход используется для переходов любой длины внутри сегмента памяти. При этом машинная команда безусловного перехода занимает 3 байта – один для КОП и 2 – для “расстояния” перехода. Для указания транслятору, что переход не короткий, используется слово near. Например:

jmp            near  .A50

                 .   .   .   .   .   .   .   .   .   .

.А50:

Внутрисегментный косвенный переход задается путем записи в качестве операнда оператора jmp не метки, а адреса данных. По этому адресу (в регистре или в слове ОП) записано требуемое содержимое IP. Допустим, имеется оператор:

jmp            bx

Если в момент исполнения соответствующей машинной команды (ВХ) = 1АВh, то ЦП запишет в IP это число 1АВh и извлечет следующую машинную команду из ОП по физическому адресу (CS)x16 + 1АВh.

В следующем примере искомый адрес-смещение перехода получается суммированием (BX) и числа 10:

jmp    [bx+10]

Допустим, что слово ОП с именем test содержит адрес-смещение той команды программы, на которую требуется сделать переход:    

jmp    [test]

Другие примеры внутрисегментных косвенных переходов:

jmp    [bx+test]

jmp    [bx+test+10],

Межсегментрый прямой переход задается путем записи в качестве операнда оператора jmp метки перехода типа far (дальняя). Пример:

jmp   far  test

Межсегментрый косвенный переход задается путем записи в качестве операнда оператора jmp не метки перехода, а имени поля данных длиной два слова, которое содержит логический адрес перехода. При этом первое слово содержит целевое (IP) – адрес-смещение, а второе слово содержит (CS) – адрес-сегмент. Имя поля, содержащего логический адрес, заключается в квадратные скобки и ему предшествует вспомогательный псевдооператор far (дальний). Пример:

.   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .

Old             dd     0                          ; Для логического адреса перехода

.   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .

jmp   far     [Old]          ; Межсегментный косвенный переход

 


Предыдущий раздел В начало Следующий раздел