САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ТЕХНИЧЕСКОЙ КИБЕРНЕТИКИ
КАФЕДРА АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
по лабораторной работе
Изучение принципов обработки внутренних прерываний
Работу выполнил студент 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.