- •Лекция №33 Адресация регистров и ячеек памяти в ассемблере. Основные команды языка ассемблер.
- •Адресация регистров и ячеек памяти в ассемблере
- •1.1 Непосредственная адресация
- •1.2 Прямая адресация регистров мпп
- •1.3 Адресация ячеек оп
- •Основные команды ассемблера
- •2.1 Команды пересылки данных
- •2.2 Арифметические команды
- •2.4 Команды приращения
- •2.5 Команды умножения
- •2.3 Команды сложения, вычитания и сравнения
- •2.6 Команды деления
- •2.7 Логические команды
- •2.8 Команды безусловной передачи управления
- •2.9 Команды перехода к подпрограмме и выхода из подпрограммы
- •2.10 Команда перехода к подпрограмме: calLopr
- •2.11 Команда выхода из подпрограммы
- •2.12 Команды условной передачи управления
- •2.13 Команды управления циклами
- •2.14 Команды прерывания
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 символьное_имя.
