Приведенный пример носит условный характер;
…
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]
Возможно также использование базово-индексной адресации, если в сегменте данных имеется таблица с двухсловными адресами точек переходов.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий