- •Отчёт о лабораторной работе №5
- •1. Стандартный обработчик int0
- •2. Замена стандартного обработчика int0 с использованием функций dos 25h и 35h
- •3. Замена стандартного обработчика int0 без использования функций dos 25h и 35h
- •4. Передача управления обработчику bios
- •5. Трассировка фрагмента программы
- •6. Сброс т-бита в обработчике int1
- •7. Использование вызовов прерываний по точке останова для ограничения трассируемого фрагмента программы
7. Использование вызовов прерываний по точке останова для ограничения трассируемого фрагмента программы
Файл p1-7.asm:
stacksg segment para stack 'Stack'
dw 32 dup(?)
stacksg ends
datasg segment para 'Data'
stdOfs1 dw ?
stdSeg1 dw ?
stdOfs3 dw ?
stdSeg3 dw ?
string db '0000h',13,10,'$'
question db 'Сколько раз вы желаете инкрементировать BX?',13,10
db '(Введите число от 1 до 9)',13,10,'$'
datasg ends
codesg segment para 'Code'
begin proc far
assume ss:stacksg,ds:datasg,cs:codesg
push ds ;помещаем в стек слово из ds
mov ax,0 ;и нулевое слово для корректного
push ax ;выхода из программы
mov ax,datasg ;запись datasg в ds
mov ds,ax ;для использования сегмента данных
;сохранение стандартных векторов прерывания
mov ax,3501h
int 21h
mov stdOfs1,bx
mov stdSeg1,es
mov ax,3503h
int 21h
mov stdOfs3,bx
mov stdSeg3,es
;задание собственных векторов
push ds
mov dx,offset myInt1
mov ax,seg myInt1
mov ds,ax
mov ax,2501h
int 21h
mov dx,offset myInt3
mov ax,seg myInt3
mov ds,ax
mov ax,2503h
int 21h
pop ds
;чтение входного параметра
mov dx,offset question
mov ah,9
int 21h
mov ah,1
int 21h ;код символа в AL
mov ah,al
mov cx,4
shr ah,cl
cmp ah,3
jne notNum
and al,0Fh
jz notNum
cmp al,9
ja notNum ;jump if above
mov cl,al
notNum: mov dx,offset string
add dx,5
mov ah,9
int 21h
mov bx,0
int 3
m1: inc bx
loop m1 ;dec cx and jump if no zero
int 3
;восстановление стандартных векторов прерывания
push ds
mov dx,stdOfs1
mov ax,stdSeg1
mov ds,ax
mov ax,2501h
int 21h
pop ds
mov dx,stdOfs3
mov ax,stdSeg3
mov ds,ax
mov ax,2503h
int 21h
dec sp
dec sp
pop ds
ret
begin endp
myInt1 proc
push ax
push cx
push dx
push di
add sp,8
pop ax
sub sp,10
mov di,offset string
add di,4
mov cx,4
cycle: dec di
mov dl,al
and dl,0Fh
cmp dl,9
ja above
or dl,30h
jmp write
above: sub dl,9
or dl,40h
write: mov ds:[di],dl
push cx
mov cl,4
shr ax,cl
pop cx
loop cycle
mov dx,di
mov ah,9
int 21h
pop di
pop dx
pop cx
pop ax
iret
myInt1 endp
myInt3 proc
push ax
push dx
add sp,8
pop ax
mov dx,ax
and dx,0100h
jz set
and ax,0FEFFh
jmp m2
set: or ax,0100h
m2: push ax
sub sp,8
pop dx
pop ax
iret
myInt3 endp
codesg ends
end begin
Для наглядности работы программы был введен входной параметр, от которого зависит количество циклов. Функция DOS 01h ожидает ввода символа с клавиатуры с выводом его на дисплей. ASCII код символа записывается в AL. Обработчик int1 выводит на дисплей адрес исполняемой команды (IP) в трассируемом фрагменте. Обработчик int3 инвертирует бит Т. Результаты:
C:\MASM611\BIN>p1-7.exe
Сколько раз вы желаете инкрементировать BX?
(Введите число от 1 до 9)
3
0070h
006Fh
0070h
006Fh
0070h
0072h
Обработчик int1 выводит адрес команды, которая будет выполняться после возврата из обработчика.
Выводы:
В MS-DOS возможно исследование принципов обработки внутренних прерываний. Внутренние прерывания делятся на логические (арифметические ошибки типа деления на ноль или переполнения) и отладочные (для организации отладочных режимов). При возникновении внутреннего прерывания в стеке сохраняются регистры RF, CS и IP, обнуляются флаг трассировки и флаг разрешения прерываний, и управление передаётся обработчику прерывания, адрес которого указан в таблице прерываний. После обработки прерывания из стека восстанавливаются значения регистров IP, CS и RF. Возврат происходит к следующей команде вызывающей программы. В реальном режиме работы процессора таблица прерываний расположена в младшем килобайте ОЗУ и содержит адреса обработчиков 256 прерываний. Каждый вектор прерывания имеет длину 4 байта. Первые 8 векторов – это адреса обработчиков внутренних прерываний.
BIOS служит для организации обмена информацией между процессором и внешней аппаратурой, он содержит набор программ обработки аппаратных прерываний и основанные на них обработчики программных прерываний. Обработчики DOS основаны на обработчиках BIOS. Использование обработчиков программных прерываний BIOS и DOS существенно облегчает процесс программирования. Стандартную программу обработки прерывания можно заменить на собственную, изменив вектор прерывания. Перед завершением программы адрес стандартного обработчика должен быть восстановлен. В противном случае при появлении данного прерывания после завершения программы управление будет передано на то место, где нашего обработчика уже нет.
Использованные источники:
"Ассемблер и программирование для IBM PC", Питер Абель.
"Архитектура компьютера", 5-е изд., Эндрю Таненбаум.
"Самоучитель по системным функциям MS-DOS", К.Г. Финогенов.