Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Команды безусловного перехода






Рассмотрим сначала команды безусловного перехода, которые всегда передают управление в указанную в них точку программы. На языке Ассемблера все эти команды записываются в виде

jmp op1

Здесь op1 может иметь следующие форматы:

op1 Способ выполнения Вид перехода
i8 IP: = (IP + i8)mod 216 Близкий относительный короткий
i16 IP: = (IP + i16)mod 216 Близкий относительный длинный
r16 IP: = [r16] Близкий абсолютный косвенный
m16 IP: = [m16] Близкий абсолютный косвенный
m32 IP: = [m32], CS: = [m32+2] Дальний абсолютный косвенный
seg: off IP: = off, CS: = seg Дальний абсолютный прямой

Здесь seg: off – это мнемоническое обозначение двух операндов в формате i16, разделённых двоеточием. Как видно из этой таблицы, многие потенциально возможные виды безусловного перехода (например, близкие абсолютные прямые, близкие абсолютные короткие и др.) не реализованы в нашей архитектуре. Это сделано исключительно для упрощения центрального процессора (не нужно реализовывать в нём эти команды) и для уменьшения размера программы (чтобы длина поля кода операции в командах не была слишком большой).

Рассмотрим теперь, как на языке Ассемблера задаются эти операнды команд безусловного перехода. Для указания близкого относительного перехода в команде обычно записывается метка команды, на которую необходимо выполнить переход, например:

jmp L; Перейти на команду, помеченную меткой L

Напомним, что вслед за меткой команды, в отличие от метки области памяти, ставится двоеточие. Так как значением метки является её смещение в том сегменте, где эта метка описана, то программе Ассемблера приходится самой вычислять необходимое смещение i8 или i16, которое необходимо записать на место операнда в команде на машинном языке [17], например:

L: add bx, bx; < ─ ┐

... │

... │ i8 или i16 (со знаком!)

... │

jmp L; L = i8 или i16 < ─ ┘

Здесь формат операнда (i8 или i16) выбирается программой Ассемблера автоматически, в зависимости от расстояния в программе между командой перехода и меткой. Если же метка L располагается в программе после команды перехода, то Ассемблер, ещё не зная истинного расстояния до этой метки, " на всякий случай" заменяет эту метку на операнд размера i16. Поэтому для тех программистов, которые знают, что смещение должно быть формата i8 и хотят сэкономить один байт памяти, Ассемблер предоставляет возможность задать размер операнда в явном виде:

jmp short L

Ясно, что это нужно делать только при острой нехватке оперативной памяти для программы. [18] Для явного указания дальнего перехода программист должен использовать оператор far ptr, например:

jmp far ptr L

Приведём фрагмент программы с различными видами командам безусловного перехода, в этом фрагменте описаны два кодовых сегмента (для иллюстрации дальних переходов) и один сегмент данных:

 

data segment

A1 dw L2; Смещение команды с меткой L2 в своём сегменте

A2 dd Code1: L1; Это seg: off

...

data ends

code1 segment

...

L1: mov ax, bx

...

code1 ends

code2 segment

assume cs: code2, ds: data

start: mov ax, data

mov ds, ax; загрузка сегментного регистра DS

L2: jmp far ptr L1; дальний прямой абсолютный переход, op1=seg: off

...

jmp L1; ошибка т.к. без far ptr

jmp L2; близкий относительный переход, op1=i8 или i16

jmp A1; близкий абсолютный косвенный переход, op1=m16

jmp A2; дальний абсолютный косвенный переход, op1=m32

jmp bx; близкий абсолютный косвенный переход, op1=r16

jmp [bx]; ошибка, нет выбора: op1=m16 или m32?

mov bx, A2

jmp dword ptr [bx]; дальний абсолютный косвенный переход op1=m32

...

code2 ends

 

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

Как видим, архитектура нашего компьютера обеспечивает большой спектр команд безусловного перехода. Напомним, что в нашей учебной машине УМ-3 была только одна команда безусловного перехода. На этом мы закончим наше краткое рассмотрение команд безусловного перехода. Напомним, что для усвоения материала по курсу Вам необходимо изучить соответствующий раздел учебника по Ассемблеру.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал