Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 44.Ассемблер.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
56 Кб
Скачать
☆

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

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

  • По прямому адресу: JMP метка.

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

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

  • В памяти с косвенной адресацией: JMPnearptr[SI]; JMPfarptr[BX] и т. д.

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

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

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

ргос '... endp

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

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

retDISPendp

2.10 Команда перехода к подпрограмме: calLopr

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

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

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

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

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

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

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

  • косвенным:

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

О процедура с атрибутом far вызывется, используя переменную размером в двойное слово:CALL dwordptr символьное_имя.