- •Отчёт о лабораторной работе №5
- •1. Стандартный обработчик int0
- •2. Замена стандартного обработчика int0 с использованием функций dos 25h и 35h
- •3. Замена стандартного обработчика int0 без использования функций dos 25h и 35h
- •4. Передача управления обработчику bios
- •5. Трассировка фрагмента программы
- •6. Сброс т-бита в обработчике int1
- •7. Использование вызовов прерываний по точке останова для ограничения трассируемого фрагмента программы
Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
Отчёт о лабораторной работе №5
Дисциплина: Системное программное обеспечение
Тема: Изучение принципов обработки внутренних прерываний
Д.А.
Киселёв Е.В. Душутина
Преподаватель
Санкт-Петербург
2012
Цель работы:
Знание внутренних прерываний и флаговой логики процессора, источников возникновения внутренних прерываний, умение перехватывать прерывания и передавать управление соответствующим системным обработчикам.
Программа работы:
Проанализировать содержимое стандартного обработчика прерываний по ошибке операции деления.
Заменить стандартный обработчик int0 на собственный, используя функции DOS для замены вектора прерывания и функцию 9h для иллюстрации работы нового обработчика.
Преобразовать программу так, чтобы не применять функции DOS для получения и установки вектора прерываний int0.
Организовать передачу управления обработчику BIOS после выполнения всех команд прерывания.
Составить программу инкрементации содержимого регистра BX и дополнить её так, чтобы стала возможной трассировка этого фрагмента инкрементации.
Преобразовать программу так, чтобы сброс Т-бита производился в прерывании int1.
Функционально завершить программу, используя вызовы прерываний по точке останова для ограничения трассируемого фрагмента программы.
Подготовка к работе:
С помощью утилиты hp_usb_tool, скачанной с сайта acerfans.ru, создан загрузочный USB-флеш-накопитель c MS-DOS и туда же скопированы необходимые файлы для работы в DOS и masm6.11, который был скачан с http://www.kalashnikoff.ru/Assembler/prog. Далее для ознакомления с ассемблером x86 процессоров была написана программка при помощи книги Питера Абеля "Ассемблер и программирование для IBM PC". Текст программы (файл myhello.asm):
;сегмент стека по имени stacksg, выровнен относительно параграфа (4 бита)
stacksg segment para stack 'Stack'
db 32 dup(?) ;зарезервировать 32 байта
stacksg ends ;конец сегмента стека
datasg segment para 'Data' ;сегмент данных
MorningMess db 'Good morning, world!$'
AfternoonMess db 'Good afternoon, world!$'
;строка заканчивается на '$', чтобы подпрограмма вывода строки могла
;закончить свою работу, дойдя до этого символа
datasg ends ;конец сегмента данных
codesg segment para 'Code' ;сегмент кода
;процедура begin, far указывает, что начинать надо с этой процедуры
begin proc far
;директива assume устанавливает для ассемблера соответствие
;между сегментами и сегментными регистрами
assume cs:codesg,ds:datasg,ss:stacksg
;загрузчик записывает в ds адрес для возврата из программы
;его надо сохранить в стеке, чтобы затем команда RET могла его использовать
push ds ;запись ds в стек и
sub ax,ax ;запись нулевого слова (смещение) в стек
push ax ;для корректного возврата из программы,
mov ax,datasg ;запись datasg в ds
mov ds,ax ;для использования сегмента данных
mov ah,2Ch ;чтение системного времени
int 21h ;с помощью int 21h
mov al,12 ;выполняется al:=al-ch но al не изменяется
cmp al,ch ;изменяются только флаги
jbe IsAfternoon ; jump if below or equal
IsMorning:
;записать смещение MorningMess от начала ds в регистр dx
mov dx,offset MorningMess
jmp DispGreeting
IsAfternoon:
mov dx,offset AfternoonMess
DispGreeting:
mov ah,9 ;вывод строки с помощью int 21h
int 21h ;адрес строки = (DS:DX)
ret ;выход из программы
begin endp ;конец процедуры
codesg ends ;конец сегмента кода
end begin ;конец программы
При описании сегмента указывается сначала его имя, затем директива SEGMENT, затем необязательные параметры: выравнивание (если не указано, принимается PARA), объединение (объединяет данный сегмент с другими сегментами при компоновке), класс (для группирования относительных сегментов при компоновке).
Процессор использует регистр SS для адресации стека, регистр DS для адресации сегмента данных и регистр CS для адресации сегмента кода. Ассемблеру необходимо сообщить назначение каждого сегмента. Для этой цели служит директива ASSUME.
Для инициализации ассемблерной EXE-программы в DOS необходимо выполнить следующие требования:
указать ассемблеру, какие сегментные регистры должны соответствовать сегментам;
сохранить в стеке адрес возврата, находящийся в регистре DS, когда программа начнет выполнение;
записать в стек нулевое слово (смещение);
загрузить в регистр DS адрес сегмента данных.
Загрузочному модулю в памяти непосредственно предшествует 256-байтная область, называемая префиксом программного сегмента (PSP). Программа загрузчика использует регистр DS для установки адреса начала PSP. Пользовательская программа должна сохранить этот адрес в стеке. Позже команда RET извлекает из стека 2 слова: смещение и сегментный адрес точки возврата, и использует их для возврата в DOS.