- •Отчёт о лабораторной работе №5
- •1. Стандартный обработчик int0
- •2. Замена стандартного обработчика int0 с использованием функций dos 25h и 35h
- •3. Замена стандартного обработчика int0 без использования функций dos 25h и 35h
- •4. Передача управления обработчику bios
- •5. Трассировка фрагмента программы
- •6. Сброс т-бита в обработчике int1
- •7. Использование вызовов прерываний по точке останова для ограничения трассируемого фрагмента программы
5. Трассировка фрагмента программы
При установленном бите T в регистре флагов процессор после выполнения каждой команды переходит на обработчик int1, а затем к выполнению следующей команды. Для контроля шагов трассировки заменим стандартный обработчик int1, который ничего не делает, на собственный, который выводит на дисплей символ '*'.
Файл p1-5.asm:
stacksg segment para stack 'Stack'
dw 32 dup(?)
stacksg ends
datasg segment para 'Data'
stdOfs dw ?
stdSeg dw ?
mess db '*$'
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 stdOfs,bx ;сохранить смещение
mov stdSeg,es ;сохранить сегментный адрес
;задание собственного вектора
push ds
mov dx,offset myHandler
mov ax,seg myHandler
mov ds,ax
mov ax,2501h
int 21h
pop ds
mov bx,0
mov cx,10
;установка Т бита (бит 8 в регистре флагов)
pushf ;push RF
pushf
pop ax
or ax,0100h
push ax
popf ;pop RF
m1: inc bx
loop m1 ;dec cx and jump if no zero
;сброс Т бита
popf
;восстановление стандартного вектора прерывания
push ds
mov dx,stdOfs
mov ax,stdSeg
mov ds,ax
mov ax,2501h
int 21h
pop ds
ret
begin endp
myHandler proc
push ax
push dx
mov dx,offset mess
mov ah,9
int 21h
pop dx
pop ax
iret
myHandler endp
codesg ends
end begin
Результаты при повторении цикла 10 раз:
C:\MASM611\BIN>p1-5.exe
*********************
На каждой итерации цикла выполняется 2 команды + popf после цикла, т.е. обработчик прерывания был вызван 21 раз, в чём можно убедиться посчитав звёздочки.
Результаты при повторении цикла 5 раз:
C:\MASM611\BIN>p1-5.exe
***********
Обработчик был вызван 11 раз.
6. Сброс т-бита в обработчике int1
Файл p1-6.asm:
stacksg segment para stack 'Stack'
dw 32 dup(?)
stacksg ends
datasg segment para 'Data'
stdOfs dw ? ;адрес стандартного обработчика
stdSeg dw ?
oldRF dw ? ;чтобы сохранить сюда RF перед изменением
mess db '*$'
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 stdOfs,bx ;сохранить смещение
mov stdSeg,es ;сохранить сегментный адрес
;задание собственного вектора
push ds
mov dx,offset myHandler
mov ax,seg myHandler
mov ds,ax
mov ax,2501h
int 21h
pop ds
mov bx,0
mov cx,5
;установка Т бита (бит 8 в регистре флагов)
pushf ;push RF
pop ax
mov oldRF,ax
or ax,0100h
push ax
popf ;pop RF
m1: inc bx
loop m1 ;dec cx and jump if no zero
;восстановление стандартного вектора прерывания
push ds
mov dx,stdOfs
mov ax,stdSeg
mov ds,ax
mov ax,2501h
int 21h
pop ds
ret
begin endp
myHandler proc
push ax
push dx
mov dx,offset mess
mov ah,9
int 21h
pop dx
pop ax
cmp cx,0
jne endHandle
add sp,6
push oldRF
sub sp,4
endHandle:
iret
myHandler endp
codesg ends
end begin
При переходе на обработчик прерывания в стеке сохраняются регистр флагов (RF), CS и IP, которые восстанавливаются оттуда по команде IRET. Поэтому сбрасывать бит Т надо именно в том слове в стеке, которое будет записано в RF при выходе из обработчика. После вывода символа на дисплей обработчик прерывания проверяет CX на равенство нулю, чтобы узнать, не закончился ли трассируемый фрагмент. Если CX=0, то SP увеличивается на 6. Теперь SP указывает на содержимое регистра флагов, записанное в стек при переходе на обработчик. Затем в стек кладётся начальное значение RF, которое было предварительно сохранено в ячейку памяти. Затем SP уменьшается на 4, чтобы можно было извлечь из стека адрес возврата при завершении обработчика.
Результат:
C:\MASM611\BIN>p1-6.exe
**********
Здесь 10 звёздочек, потому что бит Т сбрасывается не в основной процедуре программы а внутри обработчика прерывания.