Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM.docx
Скачиваний:
3
Добавлен:
31.07.2019
Размер:
616.28 Кб
Скачать

34Команды безусловной передачи управления. Команды вызова процедур и возврата из процедуры.

Безусловные переходы

Предыдущее обсуждение выявило некоторые детали механизма перехода. Коман-

ды перехода модифицируют регистр указателя команды EIP/IP и, возможно, сег-

ментный регистр кода CS. Что именно должно подвергнуться модификации,

зависит:

от типа операнда в команде безусловного перехода (ближний или дальний);

от модификатора, который указывается перед адресом перехода в команде пе-

рехода и может принимать следующие значения (сам адрес при прямом пере-

ходе находится непосредственно в команде, а при косвенном — в регистре или

ячейке памяти):

П NEAR PTR — прямой переход на метку внутри текущего сегмента кода, при

этом модифицируется только регистр EIP/IP (в зависимости от заданного

типа сегмента кода use!6 или 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 [модификатор] адрес_перехода

Здесь адрес_перехода представляет метку или адрес области памяти, в которой

находится указатель перехода.

Всего в системе команд процессора есть несколько кодов машинных команд

безусловного перехода JMP. Их различия определяются дальностью перехода

и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором — межсегментным, или дальним.

Внутрисегментный переход предполагает, что изменяется только содержимое регистра EIP/IP. Можно выделить три варианта внутрисегментного использования

команды JMP:

прямой короткий переход;

прямой переход;

косвенный переход.

Таким образом, модификаторы SHORT PTR, NEAR PTR и WORD PTR применяются

для организации внутрисегментных переходов, a FAR PTR и DWORD PTR — межсег-

ментных.

Для полной ясности нужно еще раз подчеркнуть, что если тип сегмента — use32,

то в тех местах, где речь шла о регистре IP, можно использовать регистр EIP и, соот-

ветственно, размеры полей смещения увеличить до 32 битов.

Процедура, или подпрограмма, — это основная функциональная единица декомпозиции (разделения на части) некоторой задачи. Процедура представляет собой

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

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

Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP.

Синтаксис описания процедуры таков (рис. 10.3).

Из рисунка видно, что в заголовке процедуры (директиве PROC) обязательным

является только задание имени процедуры. Среди большого количества операндов директивы PROC следует особо выделить [расстояние]. Этот атрибут может принимать значения NEAR или FAR и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение NEAR.

Процедура может размещаться в любом месте программы, но так, чтобы на неe случайным образом не попало управление. Если процедуру просто вставить в общий поток команд, то процессор воспримет команды процедуры как часть этогопотока и, соответственно, начнет выполнять эти команды. Учитывая это обстоятельство, есть следующие варианты размещения процедуры в программе:

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]