- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Макрокоманды.
Для каждой команды на ассемблере транслятор генерирует одну машинную инструкцию. Т.о. происходит трансляция «один в один». При трансляции программы на языке высокого уровня каждый оператор заменяется чаще всего не одной, а несколькими командами машинного языка. Т.о. можно сказать, что языки высокого уровня состоят из макрооператоров.
Ассемблер также имеет макро средства, но макроопределения или макрокоманды задаются программистом.
Использование макрокоманд (макросов) позволяет:
упростить и сократить исходный текст.
сделать программу более понятной.
уменьшить число ошибок, т.е. увеличить скорость отладки.
Макроопределения.
Прежде, чем программист сможет использовать в тексте своей программы макрокоманду, он должен сначала её определить - такое задание макрокоманды называется макроопределением.
Формат макроопределения.
имя macro ;начало макроопределения
.
. ;тело макроопределения
. .
endm ;конец макроопределения
Директива macro указывает ассемблеру, что следующие команды до директивы endm являются макроопределением. Теперь при трансляции программы, когда ассемблер встретит имя программы, вместо него будут подсьавлены команды, составляющие тело макроса.
Например:
_print_ macro ;Вывод сообщения на экран
mov ah, 09h
lea dx, mes
int 21h
endm
Использование параметров в макроопределениях.
В предыдущем примере макрокоманда всегда выводит на экран сообщение, находящееся в mes.
Для того, чтобы макрокоманда была более гибкой и могла распечатывать любые сообщения, определим указатель сообщения, как формальный параметр. Формальный параметр в макроопределении указывает ассемблеру на соответствие их имен аналогичным именам в теле макроопределения.
Например:
_print_ macro msg ;Вывод сообщения на экран
mov ah, 09h
lea dx, msg
int 21h
endm
Теперь при использовании директивы _print_ необходимо указать в качестве параметра действительный адрес сообщения, например:
_print_ msg1
_print_ msg2
Макроопределение может содержать ссылку на другое макроопределение.
Рассмотрим пример:
dos21 macro dosfunc
mov ah, dosfunc
int 21h
endm
Для использования данной макрокоманды при вводе с клавиатуры необходимо:
lea dx,namepar
dos21 0ah
Предполагается, что имеется другое макроопределение, использующее функцию 02 в регистре ah для ввода символа.
disp macro char
mov ah,02
mov dl,char
int 21h
endm
Можно изменить макроопределение disp, воспользовавшись макрокомандой dos21:
disp macro char
mov dl,char
dos21 02
endm
Для вывода ‘*’ достаточно просто написать:
disp ‘*’
Директива local
Если в теле макрокоманды определены метки, то при использовании такой макрокоманды в программе более одного раза - метки будут повторятся и ассемблер выдаст сообщение об ошибке.
Для обеспечения уникальности генерируемых в каждом макрорасширении имен используется директива LOCAL, которая должна быть непосредственно после macro.
Общий формат:
local метка1, метка2
Например:
prim_ macro
local compar,exit
...
compar: ...
...
exit: ...
и макрокоманда prim_ два раза встречается в контексте нашей программы:
...
prim_
...
prim_
В первом макрорасширении генерируются метки ??0000 и ??0001 соответственно для compar и exit. Во втором макрорасширении - метки ??0002 и ?0003 и т.д.