Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

Основы программирования

81

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

mov BX,offset go_addr jmp [BX]

;B ВХ смещение поля с адресом перехода ;Переход в точку go

Особенно большие возможности предоставляет методика косвенного перехода с использованием базово-индексной адресации через пары ре­гистров, например, [BX][SI] или [BX][DI]. Этот способ удобен в тех случа­ях, когда имеется ряд альтернативных точек перехода, выбор которых за­висит от некоторых условий. В этом случае в сегменте данных создается не одно поле с адресом, а таблица адресов переходов. В базовый регистр ВХ загружается адрес этой таблицы, а в один из индексных регистров — оп­ределенный тем или иным способом индекс в этой таблице. Переход осу­ществляется в точку, соответствующую заданному индексу. Структура про­граммы, использующий такую методику, выглядит следующим образом:

code segment

mov BX,offset go_tbl mov SI,4

jmp [BX][SIj gol: go2: go3:

code ends data segment go_tbl label word gol_addrdw gol

go2_addrdw go2 go3_addrdw go3 data ends

;3агружаем в ВХ базовый адрес таблицы

вычисленное каким-то

;образом смещение в таблице

;Если индекс =4, переход в точку go3

;1-я точка перехода ;2-я точка перехода ;3-я точка перехода

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

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

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

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

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

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

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

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

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

переход относят к категории прямых, а не косвенных, однако это вопрос не столько принципа, сколько терминологии.

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

mov BX,oflset gol jmp BX

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

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

codel segment

assume CS:code 1 ,DS:data

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

codel ends code2 segment assume CS:code2

go:

code 2 data

;Точка перехода в другом сегменте команд

ends segment

go_addr dd go Двухсловный адрес точки перехода

data

ends

Точка перехода go находится в другом сегменте команд этой двухсег-ментной программы. В коде команды dddd обозначает относительный ад­рес слова go_addr в сегменте данных. Ячейка go_addr объявляется дирек­тивой dd (define double, определить двойное слово) и содержит двухслов­ный адрес точки перехода; в первом слове содержится смещение go в сегменте команд codel, во втором слове сегментный адрес code2. Оба ком­понента адреса перехода могут быть вычислены и помещены в ячейку go_addr по ходу выполнения программы.

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

82