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


         

Приведенный пример носит условный характер;




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
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий