Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО отчёт №5.docx
Скачиваний:
9
Добавлен:
16.04.2015
Размер:
70.18 Кб
Скачать

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных Систем и Программных Технологий

Отчёт о лабораторной работе №5

Дисциплина: Системное программное обеспечение

Тема: Изучение принципов обработки внутренних прерываний

Д.А. Киселёв Е.В. Душутина

Выполнил студент гр. 4081/10

Преподаватель

Санкт-Петербург

2012

Цель работы:

Знание внутренних прерываний и флаговой логики процессора, источников возникновения внутренних прерываний, умение перехватывать прерывания и передавать управление соответствующим системным обработчикам.

Программа работы:

  1. Проанализировать содержимое стандартного обработчика прерываний по ошибке операции деления.

  2. Заменить стандартный обработчик int0 на собственный, используя функции DOS для замены вектора прерывания и функцию 9h для иллюстрации работы нового обработчика.

  3. Преобразовать программу так, чтобы не применять функции DOS для получения и установки вектора прерываний int0.

  4. Организовать передачу управления обработчику BIOS после выполнения всех команд прерывания.

  5. Составить программу инкрементации содержимого регистра BX и дополнить её так, чтобы стала возможной трассировка этого фрагмента инкрементации.

  6. Преобразовать программу так, чтобы сброс Т-бита производился в прерывании int1.

  7. Функционально завершить программу, используя вызовы прерываний по точке останова для ограничения трассируемого фрагмента программы.

Подготовка к работе:

С помощью утилиты 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.