Переходы
Косвенный дальний (межсегментный) переход
Как и в случае ближнего перехода, переход осуществляется по адресу, который содержится в ячейке памяти, однако эта ячейка имеет размер 2 слова, и в ней содержится полный (сегмент плюс смещение) адрес точки перехода. Программа в этом случае должна включать по меньшей мере два сегмента команд. Структура программы с использованием косвенного дальнего перехода может выглядеть следующим образом:
code1 segment assume CS:code1,DS:data … jmp DS:go_addr; Код FF 2E dddd … code1 ends code2 segment assume CS:code2 … go:;Точка перехода в другом сегменте команд … code2 ends data segment … go_addrdd go;Двухсловный адрес точки перехода … data ends
Точка перехода go находится в другом сегменте команд этой двухсегментной программы. В коде команды dddd обозначает относительный адрес слова go_addr в сегменте данных. Ячейка go_addr объявляется директивой dd (define double, определить двойное слово) и содержит двухсловный адрес точки перехода; в первом слове содержится смещение go в сегменте команд codel, во втором слове сегментный адрес codel. Оба компонента адреса перехода могут быть вычислены и помещены в ячейку go_addr по ходу выполнения программы.
Как и в случае ближнего косвенного перехода, ассемблер допускает различные формы описания дальнего косвенного перехода через ячейку сегмента данных:
jmp DS:go_addr;Возможна замена сегмента jmp dword ptr go_addr;Если поле go_addr объявлено ;операторами dw jmp go_addr;Характеристики ячейки должны ;быть известны
Для дальнего косвенного перехода, как и для ближнего, допустима адресация через регистр общего назначения, если в него поместить адрес поля с адресом перехода:
mov BX,offset go_addr jmp [BX]
Возможно также использование базово-индексной адресации, если в сегменте данных имеется таблица с двухсловными адресами точек переходов.