
- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Прерывания.
Прерывание (interrupt) – это аппаратная функция, вызывающая приостановку операций CPU, запоминание его состояния и выполнение специальной программы, которая называется программой обработки прерывания (interrupt service routine - ISR) или обработчиком прерывания (interrupt handler).
Существует три класса прерываний:
внутренние
внешние (аппаратные)
программные
Внутренние прерывания инициируются состоянием самого процессора (например, деление на ноль)
Внешние – сигналом, подаваемым в CPU другими компонентами вычислительной системы (например, при любом нажатии на клавишу).
Программные прерывания – специальной командой INT.
Независимо от источника, действия CPU по обслуживанию прерывания всегда выполняются одинаково, как для аппаратного, так и для программных прерываний.
Микропроцессоры семейства 8086 способны обрабатывать 256 типов прерываний. Каждое прерывание имеет номер от 0 до 255.
Начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний. Вектор прерывания – это 2 слова памяти (4 Байта), в которых хранятся адреса программ обработки прерываний (ISR). В старшее слово записывается сегментный адрес ISR, в младшее слово – сещение ISR, то етсь относительный адрес точки входа ISR в сегменте. Вектор 0 располагается, начиная с адреса 0, вектор 1 – с адреса 4, вектор 2 – с адреса 8 и т.д. Вектор с номером N занимает, таким образом, байты с N*4 до N*4+3.
Получив сигнал на выполнение процедуры прерывания с определенным номером, CPU сохраняет в стеке выполняемой программы текущее содержимое трех регистров процессора: регистра флагов, CS и IP. Два последних образуют полный адрем возврата в прерванную программу. Далее процессор загружает CS и IP из соответствующеговектора прерывания, осуществляя тем самым переход на ISR.
Программа ISR обычно заканчивается командой возврата из прерывания iret (interrupt return - возврат из прерывания), которая выполняет обратные действия - загрузку IP, CS и регистра флагов из стека, что приводит к возврату в основную программу.
Большая часть векторов прерывания предназначена для выполнения определенных действий и автоматически заменяется адресами системных программ при загрузке системы; часть векторов зарезервирована для будущих применений, а часть (конкретно с номерами 60h...66h) свободна и может использоваться в прикладных программах.
Программные прерывания служат удобным интерфейсом между прикладными программами и DOS. На самом деле они ничего не прерывают, а являются формой обращения к процедуре. Когда программе требуется выполнение какой-либо функции DOS, она вызывается, обрабатывая соответствующее прерывание. При этом можно не знать, в каком месте ОП находится подпрограмма, реализующая функцию, и тем более, что физические адреса компонентов DOS могут меняться.
code_seg segment
assume cs:code_seg, ds:code_seg, ss:code_seg
org 100h
start:
jmp begin
line db 2
column db 10
sym db 01h
;
begin:
mov ah,25h ;функция заполнения вектора прерывания
mov al,65h ;номер вектора
mov dx,offset new_65h ;смещение обработчика
int 21h
;
gogo:
int 65h
mov ah,02h ;функция позиционирования
mov bh,0 ;видеостраница
mov dh,line ;строка
mov dl,column ;столбец
int 10h
;
mov ah,0ah ;функция вывода символа без атрибута
mov al,sym ;символ
mov bh,0 ;видеостраница
mov cx,60 ;коэффициент повторения
int 10h
;
inc sym ;следующий символ
inc line ;следующая строка
mov ah,08h ;функция вывода без эха,
; чувствительна на Ctrl+C
int 21h
;
jmp gogo
;
new_65h proc near
mov ah,06h ;функция задания окна
mov al,0 ;режим создания (нет прокрутки)
mov bh,1bh ;атрибут всех символов в окне
;(светло-бирюзовые символы, синий фон)
mov cx,0 ;левый верхний угол 0,0
mov dh,24 ;нижняя Y-координата
mov dl,79 ;правая X-координата
int 10h
iret
new_65h endp
code_seg ends
end start