
- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Перечисление условных директив.
-
if выражение
Если выражение не равно нулю, ассемблер обрабатывает операторы в условном блоке
ife выражение
Если выражение равно нулю, ассемблер обрабатывает операторы в условном блоке
if1
Если осуществляется первый проход, ассемблер обрабатывает операторы в условном блоке
if2
Если осуществляется второй проход, ассемблер обрабатывает операторы в условном блоке
ifdef идентификатор
Если идентификатор определен в программе, или объявлен как extrn, ассемблер обрабатывает операторы в условном блоке
ifndef идентификатор
Если идентификатор не определен в программе, или не объявлен как extrn, ассемблер обрабатывает операторы в условном блоке
ifb <аргумент>
Если аргументом является пустой символ, ассемблер обрабатывает операторы в условном блоке
ifnb <аргумент>
Если аргументом является не пустой символ, ассемблер обрабатывает операторы в условном блоке
if1dn <арг1>,<арг2>
Если строка первого аргумента идентична строке второго аргумента, ассемблер обрабатывает операторы в условном блоке
ifdif <арг1>,<арг2>
Если строка первого аргумента отличается от строки второго аргумента, ассемблер обрабатывает операторы в условном блоке
Пример использования ifnb.
dos21 macro dosfunc, dxaddres
mov ah,dosfunc
ifnb <dxaddres>
mov dx,offset dxaddres
endif
entif
int 21h
endm
Команда для ввода символа с клавиатуры можно использовать макрокоманду:
dos21 01
Тогда макрорасширение будет:
mov ah,01
int 21h
Для ввода строки в dx необходимо занести адрес строки:
dos21 0ah,field
В результате
mov ah,0ah
mov dx,offset field
int 21h
Пример использования макроопределений.
Использование макроопределений делает ассемблерную программу легко читаемой. Предположим нам нужна процедура позволяющая определить является ли некоторый символ цифрой в ASCII-коде или нет. Символ передается в эту процедуру через al. Процедура должна возвратить значение true, если содержимое al находится в диапазоне 0...9 и false в обратном случае.
a_digit proc
cmp al,’0’
jb _false
cmp al,’9’
ja _false
clc
ret
_false: stc
ret
endp
Эта программа очень проста, однако команды cmp, jb и ja делают её непонятной с первого взгляда.
Используя соответствующее макроопределение эта процедура м.б. такой:
a_digit proc
if_al {,’0’ _false
if_al },’9’ _false
ret_true
_false: ret_false
endp
Это транслируется точно в такой же код:
ret_false macro
stc
ret
endm
ret_true macro
clc
ret
endm
Если необходимо написать:
if_al < 12, goto_label
С помощью макроопределения можно сделать так:
if_al {,12,_label
можно использовать:
{ - меньше
{= - меньше или равно
= - равно
{} - не равно
} - больше
}= - больше или равно