Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 1).doc
Скачиваний:
148
Добавлен:
08.03.2015
Размер:
435.2 Кб
Скачать

3.10.2. Адресация переходов

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

Внутрисегментный прямой переход

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

При трансляции команды вычисляется смещение disp=offset LabelNear(IP) и включается в ее машинный код. Смещение disp может иметь 8-битное или 16-битное значение.

При выполнении такой команды вычисляется эффективный адрес перехода EA=(IP)+disp и заносится в регистр IP. При этом управление может передаваться в пределах всего сегмента программного кода. Такой переход называется ближним переходом или переходом типа NEAR.

Пример 3.39:

JMP Begin ; Ближний переход на метку Begin

JMP Buffer+10 ; Ближний переход на ячейку, отстоящую

; от метки Buffer на 10 байтов

Внутрисегментную прямую адресацию часто называют относительной адресацией, так как смещение disp вычисляется относительно (IP).

Внутрисегментный косвенный переход

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

Пример 3.40:

JMP AX ;Ближний переход по адресу из AX

JMP Alpha ;Ближний переход по адресу из

;ячейки Alpha (если Alpha DW?)

JMP WORD PTR[SI] ;Ближний переход по адресу из

;ячейки, адресуемой SI

При выполнении этих команд содержимое IP заменяется содержимым указанного операнда, что и соответствует ближнему переходу.

Межсегментный прямой переход

В этом случае операнд записывается прямо в команде перехода в виде имени метки LabelFar, находящейся в другом сегменте программного кода по отношению к этой команде. Для устранения проблем, связанных с обращением вперед, в команде необходимо явно указывать тип перехода с помощью директивы PTR.

При трансляции такой команды в ее машинный код включается полный логический адрес точки назначения в формате segment:offset. При выполнении команды значение segment помещается в CS, а offsetв IP, что и соответствует передаче управления в другой сегмент программного кода.

Такой переход называется дальним переходом или переходом типа FAR.

Пример3.41:

JMP FARPTRCont ;Дальний переход на метку Cont

Межсегментный косвенный переход

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

Пример 3.42:

JMP Beta ; Дальний переход по адресу из

; ячейки Beta (если BetaDD?)

JMP DWORDPTR[BX] ; Дальний переход по адресу

; из ячейки, адресуемой BX

При выполнении этих команд младшее слово указанного двойного слова помещается в IP, а старшее в CS, что и соответствует дальнему переходу.