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

Страницы работы

Содержание работы

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ ТЕХНИЧЕСКОЙ КИБЕРНЕТИКИ

КАФЕДРА АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

ОТЧЕТ

по лабораторной работе

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

Работу выполнил студент     4081/2            

группа                               ФИО

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

подпись                             ФИО

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

2007г.


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

Для более удобного процесса сборки готовых программ был написан простой скрипт:

mkprog.bat

tasm %1

tlink %1

Программа 1.

Реализует вызов стандартного обработчика прерывания деления на 0.

Текст программы:

idiv.asm


sseg SEGMENT STACK

db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

msg1 db 'Program Started $'

msg2 db 'Calculatiion Ended$'

dseg ENDS

cseg SEGMENT

main proc FAR

ASSUME cs:cseg,ds:dseg,ss:sseg

start:

push ds

mov ax,dseg

mov ds,ax

lea dx,msg1

mov ah,9h

int 21h

mov ax,0h

push ax

mov ax,dseg

mov ds,ax

mov bl,0h

div bl

lea dx,msg2

mov ah,9h

int 21h

pop ds

ret

main  ENDP

cseg ENDS

END start


Для отображения тестового сообщения используется прерывание функция 9, инициируемая прерыванием int 21h.

Результаты выполнения программы:

Как видно из приведенного рисунка, второе тестовое сообщение на экран не выдается.


Программа 2. Реализует выполнение своего обработчика прерывания деления на 0. Для обеспечения получения и установки вектора прерывания используются функции 35h и 25h, инициируемые прерыванием int 21h.

imydiv.asm


sseg SEGMENT STACK

db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

ipsave dw 0h

cssave dw 0h

msg db 'Oops:) Division by zero!!!$'

dseg ENDS

cseg SEGMENT

main proc FAR

ASSUME cs:cseg,ds:dseg,ss:sseg

start:

; Save return address

push ds

mov ax,0h

push ax

; Init Data Segment

mov ax,dseg

mov ds,ax

mov ah,35h

mov al,0h

; Load native handler adress

int 21h

mov ipsave,bx

mov ax,es

mov cssave,ax

push ds

mov dx,offset int_zero

mov ax,seg int_zero

mov ds,ax

mov ah,25h

mov al,0h

; Write our handler's adress

int 21h

pop ds

mov bl,0h

; Try to divide by zero

div bl

push ds

mov dx,ipsave

mov ax,cssave

mov ds,ax

mov ah,25h

mov al,0h

; Restore native handler adress

int 21h

pop ds

ret

main ENDP

; Our handler

int_zero proc FAR

pop ax

; Change acc value

dec ax

push ax

push dx

lea dx,msg

mov ah,9h

; Display a message

int 21h

pop dx

iret

int_zero ENDP

cseg ENDS

END start


Результаты выполнения программы:

Работа стандартного обработчика корректно восстановлена.

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

imydiv2.asm


sseg SEGMENT STACK

db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

ipsave dw 0h

cssave dw 0h

msg db 'Oops:) Division by zero!!! --Not using DOS functions--$'

dseg ENDS

cseg SEGMENT

main proc FAR

ASSUME cs:cseg,ds:dseg,ss:sseg

start:

; Save return address

push ds

mov ax,0h

push ax

; Init Data Segment

mov ax,dseg

mov ds,ax

push di

; Load native handler adress

mov di,0h

mov ax,0h

mov es,ax

; Multiply by 4 – this is not

; needed by this program,

; just for universality

shl di,2

mov bx, es:[di]   ; Low byte

mov ax, es:[di]+2 ; High byte

mov ipsave,bx

mov cssave,ax

; Writing our handler

mov bx,offset int_zero

mov ax, seg int_zero

mov es:[di],bx

mov es:[di]+2,ax

mov bl,0h

; Divide by zero 

div bl

; Restore native handler

mov bx, ipsave

mov ax, cssave

mov es:[di],bx

mov es:[di]+2,ax

pop di

ret

main ENDP

; Our handler

int_zero proc FAR

pop ax

; Change acc value

dec ax

push ax

push dx

lea dx,msg

mov ah,9h

; Display a message

int 21h

pop dx

iret

int_zero ENDP

cseg ENDS

END start


Результаты выполнения программы:

Работа стандартного обработчика корректно восстановлена.

Программа 4. Реализует выполнение своего обработчика прерывания деления на 0, после чего передает выполнение стандартному обработчику BIOS.

iBIOS.asm


sseg SEGMENT STACK

db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

ipsave dw 0h

cssave dw 0h     

msg db 'Divide by zero!!!$'

dseg ENDS

cseg SEGMENT

main proc FAR

ASSUME cs:cseg,ds:dseg,ss:sseg

start:

push ds

mov ax, 0h       

push ax                

; Initialize data segment

mov ax, dseg

mov ds, ax

; Get native handler's adress

mov ah, 35h

mov al, 0h            

int 21h                

mov ipsave, bx

mov ax, es

mov cssave, ax   

push ds

mov dx, offset int_zero

mov ax, seg int_zero   

mov ds, ax       

; Set our handler

mov ah, 25h

mov al, 0h       

int 21h                

pop ds                            

mov bl, 0h

; Divide by zero

div bl

push ds

mov dx, ipsave

mov ax, cssave

mov ds, ax

; Restore native handlers

mov ah, 25h

mov al, 0h

int 21h

pop ds

ret

main  ENDP

int_zero proc FAR

pop ax

dec ax

push ax

push dx

lea dx, msg

; Show message

mov ah, 9h

int 21h

pop dx

push ds

mov dx, ipsave

mov ax, cssave

mov ds, ax

; Set native handler

mov ah, 25h

mov al, 0h

int 21h

pop ds

jmp dword ptr ipsave

iret

int_zero ENDP

cseg ENDS

END start


Результаты выполнения программы:

Программа 5. Реализует реализующая возможность трассировки фрагмента кода с помощью прерывания int 1.

itrace.asm


Похожие материалы

Информация о работе