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