Иллюстрированный самоучитель по Assembler


Переходы - часть 8



code ends


data segment


go_tbl label word ;Таблица адресов переходов


gol_addr dw gol ;Адрес первой альтернативной

;точки перехода


go2_addr dw go2 ;Адрес второй альтернативной

;точки перехода


go3_addr dw доЗ ;Адрес третьей альтернативной

;точки перехода


data ends

Приведенный пример носит условный характер; в реальной программе индекс, помещаемый в регистр SI, должен вычисляться по результатам анализа некоторых условий.

Наконец, существует еще одна разновидность косвенного перехода, в котором не используется сегмент данных, а адрес перехода помещается непосредственно в один из регистров общего назначения. Часто такой переход относят к категории прямых, а не косвенных, однако это вопрос не столько принципа, сколько терминологии.

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

mov BX, off set gol jmp BX

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


Косвенный дальний (межсегментный) переход.

Как и в случае ближнего перехода, переход осуществляется по адресу, который содержится в ячейке памяти, однако эта ячейка имеет размер 2 слова, и в ней содержится полный (сегмент плюс смещение) адрес точки перехода. Программа в этом случае должна включать по меньшей мере два сегмента команд. Структура программы с использованием косвенного дальнего перехода может выглядеть следующим образом:

codel segment


assume CS:codel,DS:data


jmp DS:go_addr ; Код FF 2E dddd


codel 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]

Возможно также использование базово-индексной адресации, если в сегменте данных имеется таблица с двухсловными адресами точек переходов.

 




Начало  Назад  Вперед



Книжный магазин