1 Подсистема прерываний Схема подсистемы прерываний
2 Процедура прерывания 1) Проверяется установка флажка IF (для немаскируемых прерываний этот пункт игнорируется): 1- прерывания разрешены, 0 - прерывания запрещены; 2) Если прерывание разрешено, то PUSHF PUSH CS PUSH IP 3) mov CS, mov IP, 4) После чего начинается выполнение программы обработки прерывания. 5) По завершению программы обработки: POP IP POP CS POPF
3 Структура обработчика прерывания proc far iret ; возврат управления endp
4 Классификация прерываний I. Прерывания микропроцессора(0Н-6Н): 0 - прерывание от схем контроля микропроцессора - Деление на 0; 1 - прерывание специального режима работы микропроцессора, устанавливаемого, если флажок TF=1 - Пошаговое выполнение; 2 - немаскируемое прерывание; 3 - прерывание микропроцессора, осуществляемого при обнаружении адреса останова - Точка останова; 4 - инициируется по команде INTO, используемой после выполнения арифметической операции - Переполнение; 5 - печать содержимого экрана - инициируется нажатием клавиши Print Screen.
5 Классификация прерываний (2) II. Прерывания микроконтроллера прерываний (8H- 0FH, 70Н-77Н): 8 – прерывание от таймера; 9 – прерывание от клавиатуры; 0BH – последовательный порт COM2; 0CH – последовательный порт COM1; 0DH – параллельный порт LPT2; 0EH – прерывание от НГМД (дискеты); 0FH – параллельный порт LPT1; 70H – прерывание от часов реального времени; 74H – мышь; 75H – числовой сопроцессор; 76H – контроллер винчестера (1 канал); 77H – контроллер винчестера (2 канал).
6 Классификация прерываний (3) III. Процедуры BIOS (10Н-1AH, 33H): 10Н – управление дисплеем; 11Н – определение конфигурации ПЭВМ; 12Н – определение объема памяти ПЭВМ; 13Н – управление дисковой памятью; 14Н – управление асинхронной связью; 16Н – управление клавиатурой; 17Н – управление печатающим устройством; 1AH – управление часами реального времени; 33H – управление мышью.
7 Классификация прерываний (4) IV. Процедуры пользователя (1BH и 1CH): 1BH – возможность подключения при обнаружении Ctrl-Break; 1СН – возможность подключения к обработке кванта таймера. V. Указатели системных таблиц (1DH-1FH, 41H): 1DH - таблица параметров видео; 1EH - таблица параметров дискеты; 1FH - таблица символов для графического режима; 41H - таблица параметров жесткого диска.
8 Классификация прерываний (5) VI. Прерывания DOS (20H- 3FH): 20H - нормальное завершение программы и возврат управления DOS; 21H - вызов диспетчера функций DOS; 22H - адрес пользовательской программы обработки нормального завершения программы; 23H - адрес пользовательской программы обработки завершения по Ctrl-Break; 24H - адрес пользовательской программы обработки завершения по ошибке; 25H - абсолютное чтение секторов с диска; 26H - абсолютная запись секторов на диск; 27H - завершение программы с сохранением в памяти. VII. Прерывания, зарезервированные для пользователей (60H-66H, 0F0H-0FEH).
9 Микроконтроллер прерываний Контроллер прерываний IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 Контроллер прерываний IRQ0 IRQ1 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 МП int номер Базовый вектор 70h Порты А0h, A1h Базовый вектор 8h Порты 20h, 21h
10 Стандартное подключение устройств IRQ Вектор Устройство Бит регистра маски IRQ0 08h Таймер 0 IRQ1 09h Клавиатура 1 IRQ2 0Ah Вход от схемы 2 2 IRQ8 70h CMOS и часы 0 … IRQ12 74h Мышь 4 IRQ13 75h Числовой сопроцессор 5 IRQ14 76h Контроллер винчестера (1 канал) 6 IRQ15 77h Контроллер винчестера (2 канал) 7 IRQ3 0Вh Последовательный порт COM2 3 IRQ4 0Сh Последовательный порт COM1 4 IRQ5 0Dh Параллельный порт LPT2 5 IRQ6 0Eh Контроллер гибких дисков 6 IRQ7 0Fh Параллельный порт LPT1 7
11 Управление аппаратными прерываниями x xxxxxxx xxxxxx МП IRQ0 IRQ1 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 1 IF Регистр запросов IRR Порт 20h Регистр маски IMR Порт 21h Схема анализа приоритетов Порт 20h Регистр обслуживания запросов ISR Порт 20h
12 Запрещение/разрешение прерываний Примеры: Запрет прерываний таймера in AL,21h or AL,1 out 21h,AL sti mov AL,20H out 20h,AL out 0A0h,AL iret cli Запрещены все вложенные прерывания Разрешены прерывания с более высоким приоритетом Разрешены все вложенные прерывания Разрешение прерываний таймера in AL,21h and AL,0FEh out 21h,AL
13 Сервисные функции MS DOS int 21h 1. Функции ввода с клавиатуры Примеры: 1) Ввод символа: mov AH,1 int 21h AH = 1Ожидание ввода с клавиатуры с «эхо» и проверкой на CTRL-Break Вх. - Вых.: AL = символ 2) Ввод строки String DB 50,49 dup (?) … lea DX, String mov AH,0AH int 21H A B C реальная длина строки размер буфера AH = 0AHЧтение строки в буферВх.: DS:DX – адрес буфера, первый байт – длина буфера Вых.: второй байт – реальная длина строки
14 Сервисные функции MS DOS int 21h (2) 2. Функции вывода Примеры: 1) Вывод символа: mov DL, mov AH,2 int 21h AH = 2Вывод символа с проверкой на CTRL- Break Вх.: DL = символ Вых.: - 2) Вывод строки: MSG DB Пример, 13, 10, $ … lea DX, MSG mov AH,9 int 21H AH = 9HВывод строкиВх.: DS:DX – адрес строки, завершающийся знаком $
15 Программа извлечения корня квадратного 1 = = 4 = = 9 = 3 2 title primer Code segment assume CS:Code,DS:Code ;Данные otw db 13,10,' n= ' rez db ' ',13,10,'$' string db 10,10 dup (0) zap db 'Введите число
16 Программа извлечения корня квадратного (2) ;Ввод vvod: lea DX,zap mov AH,9h int 21h lea DX,string mov AH,0ah int 21h 10 String
17 Программа извлечения корня квадратного (3) mov CL,string+1 ;Преобразование mov CH,0 mov BH,'9' mov BL,'0' lea SI,string+2 cld xor AX,AX cycle: mov DI,10 mul DI mov DI,AX lodsb cmp AL,BL jb vvod cmp AL,BH ja vvod sub AL,30h cbw add AX,DI loop cycle 10 N String N SI
18 Программа извлечения корня квадратного (4) ;Вычисление sqrt(dx#ax) mov BX,1 mov CX,0 mov DI,1 ; сумма cycl: cmp DI,AX ja preobr add BX,2 add DI,BX jc vvod inc CX jmp cycl ND:=1 N:=0 S:=1 ND:=ND+2 S:=S+ND N:=N+1 S>C cycl да нет
19 Программа извлечения корня квадратного (5) ;Преобразование preobr: mov AX,CX mov CX,3 mov DI,2 mov BX,10 again: cwd div BX add DL,30h mov rez[DI],DL dec DI loop again ;Вывод lea DX,otw mov AH,9 int 21h ret begin endp code ends end begin
20 Сервисные функции MS DOS int 21h (3) 3. Функции, работающие с векторами прерываний Примеры: 1) Загрузка вектора mov AL,9 mov AH,25h mov DX,offset prog mov DS, seg prog int 21h AH = 25hЗагрузка вектора прерываний Вх.: AL – номер вектора DS:DX – адрес обработчика Вых.: - 2) Чтение вектора mov AL,9 mov AH,35h int 21h AH = 35hЧтение вектора прерываний Вх.: AL – номер вектора Вых.: ES:BX – адрес старого обработчика
21 Структура загрузочного модуля (.exe) Структура заголовка.exe: 0 2 MZ - маркер модуля.exe 2 2 длина неполной последней страницы 4 2 количество страниц образа программы 6 2 число элементов в таблице перемещений 8 2 длина заголовка в параграфах А 2 мин. память за концом программы С 2 мах. память за концом программы Е 2 сегментное смещение сегмента стека SS 10 2 значение регистра SP при запуске 12 2 контрольная сумма файла 14 2 значение регистра IP при запуске 16 2 сегментное смещение сегмента кодов CS 18 2 смещение в файле таблицы перемещений 1А 2 номер оверлея 1С 4*[EXE+6] таблица перемещений Заголовок Образ программы Образ программы exe com Структура абсолютного модуля
22 Загрузка программ org 100H Begin: … int 20h PSP Сегмент кода Сегмент данных DS=ES= =CS=SS Сегмент стека SS 256 байт Модуль.com push DS mov AX,0 push AX mov AX, Data mov DS, AX … ret PSP Сегмент кода DS=ES CS 256 байт Модуль.exe IP=100h IP SP Cтек SP = 64 Кб
23 Префикс программного сегмента (PSP) 0 2 int 20h (CD 20); 2 2 сегментный адрес первого свободного байта; … 6 2 размер первого сегмента для com файлов; … 0Ah 4 адрес int 22h; 0Eh 4 адрес int 23h; 12h 4 адрес int 24h; 16h 2 сегментный адрес PSP родителя; 18h 20 JFT 2Сh 2 сегментный адрес блока окружения; 2Eh 4 SS:SP при входе в последний вызов int 21h; 32h 2 число элементов в JFT; 34h 4 адрес JFT; … 80h 1 длина строки аргументов в командной строке; 81h 127 строка аргументов командной строки.
24 Завершение программ 1.int 20h – СS должен указывать на PSP 2.mov AH,4Ch – при любых значениях регистров int 21h 3. int 27h – с сохранением программы в памяти, СS должен указывать на PSP 4. mov AH,31h int 21h – с сохранением программы в памяти, при любых значениях регистров
25 Директива описания сегмента SEGMENT … ENDS где : BYTE, WORD, PARA, PAGE : PUBLIC, STACK, COMMON, AT : STACK, CODE, DATA 1. Задание и модификация адресов сегментов: ASSUME CS:CODE, DS:DATA … mov AX,DATA mov DS,AX … ASSUME DS:DATA1 mov AX,DATA1 mov DS,AX … 2. Явное указание сегментного регистра: CS:A ES:[80h]
26 Пример создания многосегментного загрузочного модуля SEGMENT STACK DB 3000 DUB (?) ENDS SEGMENT ENDS END SEGMENT ASSUME … EXTRN : PUBLIC PROC FAR PUSH DS MOV AX, 0 PUSH AX MOV AX, MOV DS, AX RET ENDP PROC NEAR ENDP ENDS
27 Пример создания многосегментного абсолютного модуля Codesegment assumeCS:Code, DS:Data org100H Begin:pushCS popBX movAX,offset e+15 movCL,4 shrAX,CL addAX,BX movDS,AX … movAH,4Ch int21h eEQU$ Codeends Datasegment para … Dataends endbegin PSP Сегмент кода DS=ES= =CS=SS 256 байт Модуль.com IP=100h Сегмент данных е
28 Инсталлятор.exe Code segment assume CS:Code,Ds:Code user proc far iret finish equ $ user endp set_up proc far push DS mov AX,0 push AX mov DX,offset user mov AX,seg user mov DS,AX mov AL, mov AH,25H int 21H mov DX,finish+100H mov byte ptr ES:1,27H ret set_up endp Code ends end set_up PSP Сегмент кода DS=ES CS Модуль.exe IP Обработчик Инсталлятор CD20 finish
29 Сегмент кода Инсталлятор.com Code segment assume CS:Code,Ds:Code org 100H begin: jmp short set_up user proc far iret finish equ $ user endp set_up: mov DX,offset user mov AL, mov AH,25H int 21H lea DX,finish int 27H Code ends end set_up PSP DS=ES= =CS=SS Модуль.com IP=100h Обработчик Инсталлятор finish
30 Пользовательские обработчики прерываний А. Заменяющие системные и подключаемые к ним. Б. Резидентные и транзитные. В. Аппаратных и программных прерываний. Г. С com и exe инсталляторами. Проблемы, стоящие перед разработчиками обработчиков прерыв-й: 1. Сцепление обработчиков (для всех) 2. Сохранение регистров (для всех) 3. Использование функций DOS и BIOS (для всех) 4. Расширенная информация об ошибках (для всех) 5. Проблема стека (для аппаратных) 6. Работа с файлами (для аппаратных) 7. Обработка ^C, ^Break (для аппаратных) 8. Обработка критической ошибки (для аппаратных) 9. Передача параметров (для резидентов) 10. Проверка на установку (для резидентов) 11. Выгрузка (для резидентов) 12. Минимизация размера (для резидентов)
31 Сцепление обработчиков 1. Замена системного: mov AL, 20h; для аппаратных out 20h,AL out 0A0h,AL … iret 2. Предобработка прерываний jmp CS:OLD_ADRES 3. Постобработка прерываний pushf call CS:OLD_ADRES iret Программа Об-к Вектора Программа Об-к Вектора Сист. об-к Программа Об-к Вектора Сист. об-к
32 Проблемы использования функций DOS и BIOS в обработчиках прерываний Функции BIOS – нереентерабельны поскольку связаны с выполнением операций с устройствами. Для проверки используют перехват нескольких прерываний. Функции DOS – нереентерабельны из-за стеков. Они используют два стека. Функции, использующие разные стеки, могут выполняться одновременно. Для проверки выполнения функций DOS используется флаг INDOS
33 Резидентный обработчик int 1Ch(Ex3_1) code segment ; Резидент int 1CH org 100h assume cs:code,ds:code begin: jmp start tik db ? nch db 0 process: inc byte ptr cs:tik mp byte ptr cs:tik,10 jl a1 push es push ax В момент вызова регистр DS не загружен PSP CS,DS,ES,SS CS Программа Int 8h Int 1ch
34 Резидентный обработчик int 1Ch (2) mov ax,0b800h mov es,ax mov byte ptr cs:tik,0 inc byte ptr cs:nch mov al,cs:nch mov es:[0],al mov al, B mov es:[1],al pop ax pop es a1: push ax pop ax iret ES Видеопамять Код символа Байт- атрибут
35 Инсталлятор start: mov ax,251ch lea dx,process int 21h mov byte ptr tik,al lea dx,start int 27h code ends end begin Сегмент кода PSP DS=ES= =CS=SS Модуль.com IP=100h Обработчик Инсталлятор start