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 | Содержит адрес последнего слова, которое задает в программе сегмент стека. |
Регистр | Значение |
CS, DS, ES, SS | Содержит адрес параграфа в PSP программы. |
IP | Устанавливается в значение 100h. |
SP | Устанавливается в 0FFFEh (последнее слово в сегменте программы). |
.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; конец программы