- •Глава 14 Элементы программирования на языке ассемблера После изучения данной главы вы должны знать:
- •Основные компоненты языка ассемблер Алфавит языка
- •Константы (числа и строки) Числа — только целые
- •Строки (литералы)
- •Команды (операторы)
- •Директивы (псевдооператоры)
- •Модификаторы
- •Адресация регистров и ячеек памяти в ассемблере
- •Непосредственная адресация
- •Прямая адресация регистров мпп
- •Адресация ячеек оп
- •Основные команды языка ассемблер
- •Команды пересылки данных
- •Арифметические команды
- •Команды сложения, вычитания и сравнения
- •Команды приращения
- •Команды умножения
- •Команды деления
- •Логические команды
- •Команды безусловной передачи управления
- •Команды перехода к подпрограмме и выхода из подпрограммы
- •Команда перехода к подпрограмме: call opr
- •Команда выхода из подпрограммы
- •Команды условной передачи управления
- •Команды условной передачи управления для беззнаковых данных
- •Команды условной передачи управления для знаковых данных
- •Команды условной передачи управления для прочих проверок
- •Команды управления циклами
- •Команды прерывания
- •Основные директивы ассемблера
- •Директивы определения идентификаторов
- •Директивы определения данных
- •Директивы определения сегментов и процедур
- •Видеооперации с прерыванием 21h dos
- •Программирование работы с клавиатурой
- •Программирование работы с принтерами
- •Печатающие устройства параллельного типа
- •Печатающие устройства последовательного типа
- •Программирование работы с файлами
- •Прерывания, используемые при работе с файлами на дисках
- •Некоторые аспекты создания исполняемых программ
- •Процедуры формирования программы
- •Структура программы на языке ассемблера для получения исполняемого файла формата exe
- •Основные сведения о листинге и его структуре
- •Особенности структуры машинных команд
- •Последовательность работы пк при выполнении программы
- •Краткие сведения об отладчике программ debug
- •Основные команды отладчика debug
- •Вопросы для самопроверки
Команды безусловной передачи управления
JMP opr — команда безусловной передачи управления (jump unconditionally — перейти безусловно). Операнд opr может быть задан прямым или косвенным адресом:
По прямому адресу: JMP метка . Если метка в том же сегменте, что и команда JMP, переход считается внутренним (near), если не в том же сегменте — переход внешний (far). В написании самой команды JMP разницы нет; тип перехода определяется видом метки: после метки для внутреннего перехода ставится двоеточие «:». Транслятор по таблице меток и их адресов сам определяет атрибуты near или far, и соответственно транслирует команду передачи управления в более короткую или более длинную команду (более длинную, так как надо менять не только содержимое смещения IP, но и регистра сегментов CS). Несколько сократить длину команды может указание программиста «JMP short метка» о том, что метка не далее ±128 байтов от первого байта команды JMP (это указание не обязательно, но если оно есть и ошибочно, то транслятор выдаст ошибку).
По косвенному адресу. Косвенный адрес может быть задан: в регистре: JMP r или в памяти: JMP символьное_имя.
В памяти с косвенной адресацией: JMP near ptr [SI]; JMP far ptr [BX] и т. д.
В последних двух командах near ptr и far ptr указывать обязательно, так как какое слово содержится в регистре SI — обычное или двойное, — ассемблер заранее не знает и ему нужно помочь.
Команды перехода к подпрограмме и выхода из подпрограммы
Подпрограммы оформляются как процедуры. Процедура начинается меткой — именем процедуры и заканчивается командой выхода ret (return). В программе процедура помещается в операторные скобки:
proc ... endp
Около оператора proc могут быть указаны атрибуты дистанции: near — близкая процедура (в том же сегменте) или far — дальний вызов (если этот атрибут опущен, то подразумевается near).
Пример: DISP proc far; в отличие от метки после имени процедуры двоеточие не ставится:
ret
DISP endp
Команда перехода к подпрограмме: call opr
Вызов процедуры (call a procedure — вызов процедуры), безусловная передача управления, выполняющая короткий или дальний вызов процедуры. Флаги: не меняются.
В команде CALL атрибуты near или far указывать не надо, так как ассемблер нужную информацию получит сам из директивы определения процедуры. По команде CALL должно быть выполнено:
запоминание в стеке адреса возврата (содержимого IP и CS для следующей команды: 16 битов, если near, и 32 бита, если far);
переход к выполнению процедуры (инициируется записью в IP и в CS (если far) нового адреса команды).
Операнд opr, определяющий адрес процедуры, бывает:
непосредственным: CALL имя_процедуры;
прямым — процедуру с атрибутом near можно вызвать через регистр, в котором содержится смещение адреса процедуры: CALL r;
косвенным:
процедура с атрибутом near вызывается, используя переменную размером в слово: CALL word ptr символьное_имя,
процедура с атрибутом far — используя переменную размером в двойное слово: CALL dword ptr символьное_имя.
Команда выхода из подпрограммы
RET — возврат из процедуры (return from procedure). Команда извлекает из стека адрес возврата и возвращает управление из процедуры, вызванной ранее командой CALL. Необязательный числовой параметр команды RET указывает количество байтов, которые освобождаются в стеке после извлечения адреса возврата. Если процедура имеет атрибут near, то команда RET извлекает из стека одно слово и заносит его в регистр IP; если процедура имеет атрибут far, то команда RET извлекает из стека два слова: сначала смещение адреса, а затем адрес сегмента, и заносит их, соответственно, в регистр IP и в регистр CS. Флаги не меняются.
Процедуры могут быть вложенными, глубина вложения допускается любая (ограничивается лишь емкостью стека).