Прерывания делятся на программные и аппаратные по способу их вызова

1) Программные прерывания вызывает непосредственно программа при помощи команды int (отсюда и название - программные). Например, для того чтобы получить код клавиши, которую нажмёт пользователь (mov ah,0 int 16h), или вывести некоторую строку на экран (mov ah,9 int 21h).

2) Аппаратные прерывания вызываются самостоятельно процессором (аппаратурой компьютера) при возникновении каких-либо событий. При этом процессор прекращает выполнение текущей программы, сохраняет в стеке регистры ss, sp и флаги, вызывает соответствующее прерывание, а затем восстанавливает сохранённые регистры и продолжает выполнение текущей программы. Например: при нажатии и отпускании какой-либо клавиши пользователем вызывается прерывание ПЗУ 09h. Или прерывание таймера (также ПЗУ) 1Сh, вызываемое автоматически примерно 18,2 раза в секунду.

*******************************************************


Программы могут ненадолго заблокировать вызов аппаратных прерываний (кроме немаскируемых, типа «деления на ноль») с помощью команды cli в момент выполнения критических участков кода. К таким участкам можно отнести смену векторов прерываний напрямую в таблице векторов прерываний или смену стековых регистров. После выполнения необходимых действий программа должна снова разрешать вызов аппаратных прерываний при помощи команды sti. Если аппаратные прерывания не будут разблокированы командой sti после их блокировки командой cli, то это приведёт к «зависанию» компьютера, так как аппаратные прерывания будут заблокированы. Но при этом программные прерывания можно вызывать всегда.

Как правило, все резидентные программы пишутся в.com формате. Программы DOS могут быть записаны в двух форматах: - формат.EXE; - формат.COM.Формат EXE позволяет использовать наиболее общую в DOS сегментацию программы. Программы могут:– иметь насколько сегментов;– могут ссылаться на сегмент или группу сегментов по имени. – могут превышать по размеру 64К. Программы в формате.COM:– не могут содержать символьных ссылок на имена групп и сегментов;– обычно пишутся с использованием модели TINY;– ограничены по размеру данных или кода 64 килобайтами. При загрузке программы EXE операционная система устанавливает регистры следующим образом:
Регистр Значение
CS, DS, ES, SS Содержит адрес параграфа для префикса программного сегмента программы (PSP). PSP содержит передаваемые программе в командной строке аргументы и указатель на строку операционной среды для программы.
CS:IP Содержит начальный адрес, заданный в операторе END в одном из модулей программы, или адрес директивы STARTUPCODE
SS:SP Содержит адрес последнего слова, которое задает в программе сегмент стека.
В программах EXE можно задавать любую модель памяти. Следует использовать более простую модель, поскольку это обеспечивает быстрое выполнение и упрощает программирование. Например, если в программе никогда не предполагается использовать более 64К данных и области стека, то вполне можно использовать модель TINY.Программы COM представляют собой ограниченные версии программ EXE. Каждую программу формата COM можно представить как программу EXE, но не каждую программу EXE можно представить как программу формата COM. Здесь действуют следующие ограничения:- Программы COM следует писать с использованием модели TINY.- В программах COM нельзя использовать предопределенный сегмент стека.- Программа COM не может содержать прямых адресных ссылок на адрес сегмента или группы. Это означает, что программа не может содержать непосредственных дальних вызовов или ссылаться на сегменты по имени.- Выполнение должно начинаться со смещения 100h в сегменте кода. Чтобы это произошло, необходимо указать в качестве первой инструкции сегмента кода директиву org 100h. При загрузке программы COM устанавливаются следующие регистры:
Регистр Значение
CS, DS, ES, SS Содержит адрес параграфа в PSP программы.
IP Устанавливается в значение 100h.
SP Устанавливается в 0FFFEh (последнее слово в сегменте программы).
Если нет необходимости размещать стек в конце сегмента программы, то нужно установить новый стек. Для такого стека можно использовать неинициализированный сегмент данных (UDATASEG).Хотя программы COM должны определяться с моделью памяти TINY, с помощью директив CODESEG, DATASEG и UDATASEG можно разделить код, данные и неинициализированные данные.Как и в случае программ EXE, когда загружается программа COM, Турбо Ассемблер выделяет для ее завершения всю оставшуюся память. Пример: Создать простейшую программу, которая выводит строку «Hello World!» на экран в формате.com.

.model tiny; модель памяти, используемая для СОМ

.code; начало сегмента кода

org 100h; начальное значение счетчика - 100h

start: mov ah,9; номер функции DOS - в АН

mov dx,offset message; адрес строки - в DX

int 21h; вызов системной функции DOS

ret; завершение СОМ-программы

message db "Hello World!",0Dh,0Ah,'$'; строка для вывода

end start; конец программы


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: