- •Глава 14 Элементы программирования на языке ассемблера После изучения данной главы вы должны знать:
- •Основные компоненты языка ассемблер Алфавит языка
- •Константы (числа и строки) Числа — только целые
- •Строки (литералы)
- •Команды (операторы)
- •Директивы (псевдооператоры)
- •Модификаторы
- •Адресация регистров и ячеек памяти в ассемблере
- •Непосредственная адресация
- •Прямая адресация регистров мпп
- •Адресация ячеек оп
- •Основные команды языка ассемблер
- •Команды пересылки данных
- •Арифметические команды
- •Команды сложения, вычитания и сравнения
- •Команды приращения
- •Команды умножения
- •Команды деления
- •Логические команды
- •Команды безусловной передачи управления
- •Команды перехода к подпрограмме и выхода из подпрограммы
- •Команда перехода к подпрограмме: call opr
- •Команда выхода из подпрограммы
- •Команды условной передачи управления
- •Команды условной передачи управления для беззнаковых данных
- •Команды условной передачи управления для знаковых данных
- •Команды условной передачи управления для прочих проверок
- •Команды управления циклами
- •Команды прерывания
- •Основные директивы ассемблера
- •Директивы определения идентификаторов
- •Директивы определения данных
- •Директивы определения сегментов и процедур
- •Видеооперации с прерыванием 21h dos
- •Программирование работы с клавиатурой
- •Программирование работы с принтерами
- •Печатающие устройства параллельного типа
- •Печатающие устройства последовательного типа
- •Программирование работы с файлами
- •Прерывания, используемые при работе с файлами на дисках
- •Некоторые аспекты создания исполняемых программ
- •Процедуры формирования программы
- •Структура программы на языке ассемблера для получения исполняемого файла формата exe
- •Основные сведения о листинге и его структуре
- •Особенности структуры машинных команд
- •Последовательность работы пк при выполнении программы
- •Краткие сведения об отладчике программ debug
- •Основные команды отладчика debug
- •Вопросы для самопроверки
Команды управления циклами
Используются для повторения цикла известное число раз. Количество повторений предварительно записывается в регистр CX (счетчик циклов). Каждый цикл автоматически уменьшает показание CX на 1.
Основная команда: LOOP метка.
Циклы повторяются до обнуления CX. Команда уменьшает значение в регистре CX на единицу и передает управление по прямому адресу — метке, если значение в регистре CX не равно нулю; в противном случае выполняется следующая по порядку команда. Флаги не меняет. Существуют еще 4 альтернативные команды, в которых можно поставить дополнительные условия. Передачи управления командами типа LOOP только ближние и короткие (метки near и short).
Команды прерывания
У команд прерывания есть некоторая аналогия с командами вызова процедуры CALL: прекращается выполнение текущей программы и осуществляется переход к подпрограмме обработки прерывания; но при прерываниях нет деления на процедуры near или far, так как начальный адрес подпрограммы обработки прерывания (вектор прерывания) берется из таблицы векторов ОЗУ и он всегда 32-битовый; кроме того, при вызове процедуры в стеке сохраняется только адрес возврата, а при прерывании еще и флаги.
Имеются три команды прерывания.
INT opr Прервать (interrupt) выполнение программы и передать управление по одному из 256 адресов (векторов прерывания), определяемых номером прерывания — opr. По этой команде микропроцессор:
помещает в стек содержимое регистров: FL (флагов), CS (сегмента команд), IP (указателя команд);
обнуляет флаги TF и IF (флаги системного прерывания и блокировки прерывания);
загружает в CS и IP, соответственно, второе и первое слова вектора прерываний, считанного из таблицы векторов в ОЗУ по адресу 4 × opr (4 × номер прерывания); вся таблица векторов занимает 1024 байта, то есть всего может быть 256 различных векторов прерывания. Например, команда INT 1Ah считает из ОЗУ вектор, находящийся по адресу 68h = 4 · 1Ah, то есть в регистр CS будет загружен адрес сегмента из слова по адресу 6Ah, а в регистр IP — из слова по адресу 68h смещение программы обработки этого прерывания.
Команда сбрасывает флаги IF = 0 и TF = 0.
INTO Прервать по переполнению (interrupt if overflow),.при возникновении переполнения флаг OF = 1 и управление передается по адресу 10H (аналог команды INT 4). Команда сбрасывает флаги IF = 0 и TF = 0.
IRET Возврат из обработки прерывания (interrupt return) обеспечивает возврат из программы обработки прерывания. IRET — последняя команда подпрограммы обработки прерывания, по этой команде из стека извлекаются 3 последние слова и загружаются в регистры IP, CS и FL, при этом содержимое SP увеличивается на 6. Команда устанавливает значения всех флагов.
Основные директивы ассемблера
Напомним, что директивы (псевдооператоры) — это инструкции ассемблеру, они обрабатываются только при ассемблировании (транслировании) программы. Приведем некоторые из часто используемых директив.
Директивы определения идентификаторов
Присваивают идентификатору с данным именем некоторое текстовое или числовое значение (выражение). Формат директив:
имя EQU текст
имя = числовое значение (выражение)
Разница между псевдооператорами EQU и =:
EQU — присваивает значение постоянно (изменять нельзя), текст может быть символьным, числовым или смешанным выражением, определяющим константу, адрес, другое символьное имя, метку и т. д.;
= — выполняет текущее присваивание (значение может быть переназначено, но только при трансляции, естественно); присваивает только числовое выражение, содержащее простые математические преобразования, которые при трансляции и будут выполнены (например: const + 1, 15H*4, 3*12/4 и т. п.).