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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



JMP opr команда безусловной передачи управления (jump unconditionally— перейти безусловно). Операнд opr может быть задан прямым или косвенным адресом:

l По прямому адресу: JMP метка.
Если метка в том же сегменте, что и команда JMP, переход считается внутренним (near), если не в том же сегменте — переход внешний (far). В написании самой команды JMP разницы нет; тип перехода определяется видом метки: после метки для внутреннего перехода ставится двоеточие «:». Транслятор по таблице меток и их адресов сам определяет атрибуты near или far, и соответственно транслирует команду передачи управления в более короткую или более длинную (в последнем случак надо менять не только содержимое регистра смещения IP, но и регистра сегментов CS). Несколько сократить длину команды может указание программиста «JMP short метка» о том, что метка не далее 128 байт от первого байта команды JMP (это указание не обязательно, но если оно есть и ошибочно, то транслятор выдаст ошибку).

l По косвенному адресу. Косвенный адрес может быть задан: в регистре: JMP r или в памяти JMP символьное_имя.

l В памяти с косвенной адресацией: JMP near ptr [SI]; JMP far ptr [BX] и т.д.

В последних двух командах near ptr и far ptr указывать обязательно, так как какое слово содержится в регистре SI — обычное или двойное, — ассемблер заранее не знает и ему нужно помочь.

Команды перехода к подпрограмме и выхода из подпрограммы

Подпрограммы оформляются как процедуры. Процедура начинается именем процедуры и заканчивается командой выхода ret (return) и директивой endp.

 В программе процедура помещается в операторные скобки: proc... endp

Около оператора proc могут быть указаны атрибуты дистанции: near — близкая процедура (в том же сегменте) или far — дальний вызов (если этот атрибут дистанции опущен, то подразумевается near).

Пример: DISP proc far; в отличие от метки после имени процедуры двоеточие не ставится:

ret

DISP endp

Команда перехода к подпрограмме: CALL opr

Вызов процедуры (call a procedure — вызов процедуры), безусловная передача управления, выполняющая короткий или дальний вызов процедуры. Флаги не меняются.

В команде CALL атрибуты near или far указывать не надо, так как ассемблер нужную информацию получит сам из директивы определения процедуры. По команде CALL должно быть выполнено:

l запоминание в стеке адреса возврата (содержимого IP и CS для следующей команды: 16 битов, если near, и 32 бита, если far);

l переход к выполнению процедуры (инициируется записью в IP и в CS (если far) нового адреса команды).

Операнд opr, определяющий адрес процедуры, бывает:

l непосредственным: CALL имя_процедуры;

l прямым — процедуру с атрибутом near можно вызвать через регистр, в котором содержится смещение адреса процедуры: CALL r;

l косвенным:

l процедура с атрибутом near вызывается, используя переменную размером в слово: CALL word ptr символьное_имя,

l процедура с атрибутом far используя переменную размером в двойное слово: CALL dword ptr символьное_имя.

Команда выхода из подпрограммы

RET — возврат из процедуры (return from procedure). Команда извлекает из стека адрес возврата и возвращает управление из процедуры, вызванной ранее командой CALL. Необязательный параметр команды RET указывает количество байтов, которые освобождаются в стеке после извлечения адреса возврата. Если процедура имеет атрибут near, то команда RET извлекает из стека одно слово и заносит его в регистр IP; если процедура имеет атрибут far, то команда RET извлекает из стека два слова: сначала смещение адреса, а затем адрес сегмента, и заносит их, соответственно, в регистр IP и в регистр CS. Флаги не меняются.

Процедуры могут быть вложенными, глубина вложения допускается любая (ограничивается лишь емкостью стека).



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 55; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.247.196 (0.006 с.)