Безусловные переходы
Предыдущее обсуждение выявило некоторые детали механизма перехода. Коман-
ды перехода модифицируют регистр указателя команды EIP/IP и, возможно, сег-
ментный регистр кода CS. Что именно должно подвергнуться модификации,
зависит:
Безусловные переходы
от типа операнда в команде безусловного перехода (ближний или дальний);
от модификатора, который указывается перед адресом перехода в команде пе-
рехода и может принимать следующие значения (сам адрес при прямом пере-
ходе находится непосредственно в команде, а при косвенном — в регистре или
ячейке памяти):
PTR — прямой переход на метку внутри текущего сегмента кода, при
этом модифицируется только регистр EIP/IP (в зависимости от заданного
типа сегмента кода
или use32) на основе указанного в команде адреса
(метки) или выражения, использующего символ извлечения значения счет-
чика адреса команд ($);
П FAR PTR — прямой переход на метку в другом сегменте кода, при этом адрес
перехода задается в виде непосредственного операнда или адреса (метки)
и состоит из 16-разрядного селектора и 16/32-разрядного смещения, кото-
рые загружаются, соответственно, в регистры CS и EIP/IP;
D WORD PTR — косвенный переход на метку внутри текущего сегмента кода, при
этом модифицируется (значением смещения размером 16 или 32 бита из
памяти по указанному в команде адресу или из регистра) только регистр
EIP/IP;
D DWORD PTR — косвенный переход на метку в другом сегменте кода, при этом
модифицируются (значением из памяти — и только из памяти, из регистра
нельзя) оба регистра, CS и EIP/IP (первое слово/двойное слово адреса пере-
хода, представляющее собой смещение, загружается в EIP/IP; второе/третье
слово — в CS).
Команда безусловного перехода
Синтаксис команды безусловного перехода без сохранения информации о точке
возврата:
[модификатор] адрес_перехода
Здесь адрес_перехода представляет метку или адрес области памяти, в которой
находится указатель перехода.
Всего в системе команд процессора есть несколько кодов машинных команд
безусловного перехода JMP. Их различия определяются дальностью перехода
и способом задания целевого адреса. Дальность перехода определяется местопо-
ложением операнда адрес_перехода. Этот адрес может находиться в текущем сег-
менте кода или в некотором другом сегменте. В первом случае переход называется
внутрисегментным,
близким, во втором — межсегментным, или
Внутрисегментный переход предполагает, что изменяется только содержимое
регистра EIP/IP. Можно выделить три варианта
использования
команды
к прямой короткий переход;
К прямой переход;
косвенный переход.
Глава
Команды передачи управления
Прямой короткий внутрисегментный переход применяется, когда расстояние
от команды JMP до адреса перехода не превышает
или
байт. В этом слу-
чае транслятор ассемблера формирует машинную команду безусловного перехода
длиной всего два байта (размер обычной команды внутрисегментного безуслов-
ного перехода составляет три байта). Первый байт в этой команде — код операции,
значение которого говорит о том, что процессор должен особым образом тракто-
вать второй байт команды. Значение второго байта вычисляется транслятором как
разность между значением смещения команды, следующей за JMP, и значением
адреса перехода. При осуществлении прямого короткого перехода нужно иметь
в виду следующий важный момент, связанный с местоположением адреса перехо-
да и самой команды JMP. Если адрес перехода расположен до команды
то ас-
семблер формирует короткую команду безусловного перехода без дополнитель-
ных указаний. Если адрес перехода расположен после команды
транслятор не
может сам определить, что переход короткий, так как у него еще нет информации
об адресе перехода. Для оказания помощи компилятору в формировании команды
короткого безусловного перехода в дополнение к ранее упомянутым модификато-
рам используют модификатор SHORT PTR:
short ptr ml
;не
35-40 команд (127 байт)
Еще вариант:
m l :
более
команд (-128 байт)
jmp ml
Прямой внутрисегментный переход отличается от прямого короткого внутри-
сегментного перехода тем, что длина машинной команды
в этом случае состав-
ляет три байта. Увеличение длины связано с тем, что поле адреса перехода в ма-
шинной команде JMP расширяется до двух байтов, а это, в свою очередь, позволяет
производить переходы в пределах 64 Кбайт относительно следующей за
ко-
манды:
более 128 байт и менее 64 Кбайт
jmp ml
Косвенный внутрисегментный переход подразумевает «косвенность» задания
адреса перехода. Это означает, что в команде указывается не сам адрес перехода,
а место, где он «лежит». Приведем несколько примеров, в которых двухбайтовый
адрес перехода выбирается либо из регистра, либо из области памяти:
lea
jmp bx ;адрес перехода в регистре
ml:
ml
Безусловные переходы
jmp
перехода в ячейке памяти
Еще несколько вариантов косвенного внутрисегментного перехода:
<3>addr dw ml
<4> dw m2
mov
jmp
перехода в слове памяти
mov
jmp
В этом примере одна команда
(строка 10) может выполнять переходы на
разные метки. Выбор конкретной метки перехода определяется содержимым ре-
гистра SI. Операнд команды
определяет адрес перехода косвенно после вычис-
ления выражения addr+(SI).
<3>addr dw ml
<6>...
<7> lea
<8> jmp near
перехода в ячейке памяти addr
В данном случае указание модификатора
PTR
так как, в отли-
чие от предыдущего способа, адрес ячейки памяти addr с адресом перехода транс-
лятору передается неявно (строки 3, 7 и 8),
не имея информации о метке, он не
может определить, какой именно переход осуществляется — внутрисегментный или
межсегментный. Межсегментный переход предполагает другой формат машинной
команды
Р. При осуществлении межсегментного перехода кроме регистра EIP/IP
модифицируется также регистр CS. Аналогично внутрисегментному переходу, меж-
сегментный переход поддерживают два варианта команд безусловного перехода:
прямой и косвенный.
Команда прямого межсегментного перехода имеет длину пять байтов, из кото-
рых два байта составляют значение смещения и два байта — значение сегментной
составляющей адреса:
seg_l segment
jmp far ptr m2 ;здесь far обязательно
ml
far
seg_l ends
Глава
Команды передачи управления
seg_2 segment
label far
jmp ml ;здесь far необязательно
Рассматривая этот пример, обратите внимание на модификатор FAR PTR в ко-
манде
Его необходимость объясняется все той же логикой работы однопро-
ходного транслятора. Если описание метки (метка ml) встречается в исходном тек-
сте программы раньше, чем соответствующая ей команда перехода, то задание
модификатора необязательно, так как транслятор все знает о данной метке и сам
формирует нужную пятибайтовую форму команды безусловного перехода. В слу-
чае, когда команда перехода встречается до описания соответствующей метки,
транслятор не имеет еще никакой информации о метке, и модификатор FAR PTR
в команде
опускать нельзя, так как транслятор не знает, какую форму коман-
ды формировать — трехбайтную или
Без специального указания мо-
дификатора транслятор будет формировать трехбайтную команду внутрисегмент-
ного перехода.
Команда косвенного межсегментного перехода в качестве операнда имеет адрес
области памяти, в которой содержатся смещение и сегментная часть целевого ад-
реса перехода:
data segment
dd ml
поле
значения смещения
;и адреса сегмента метки ml
data ends
code_l segment
jmp ml
code_l ends
code_2 segment
ml label far
code_2 ends
Как вариант косвенного межсегментного перехода необходимо отметить кос-
венный регистровый межсегментный переход. В этом виде перехода адрес перехо-
да указывается косвенно — в регистре. Это очень удобно для программирования
динамических переходов, в которых адрес перехода может изменяться на стадии
выполнения программы:
data segment
addr_ml dd ml ;в поле
значения смещения
;и адреса сегмента метки ml
data ends
code_l segment
lea
jmp
ptr[bx]
code_l ends
code_2 segment
ml label far
mov
code 2 ends
Безусловные переходы
Таким образом, модификаторы SHORT PTR, NEAR PTR и WORD PTR применяются
для организации внутрисегментных переходов, a FAR PTR и DWORD PTR — межсег-
ментных.
Для полной ясности нужно еще раз подчеркнуть, что если тип сегмента — use32,
то в тех местах, где речь шла о регистре IP, можно использовать регистр EIP и, соот-
ветственно, размеры полей смещения увеличить до 32 битов.
8>7>6>3>4>3> Do'stlaringiz bilan baham: |