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

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 звёздочек, потому что бит Т сбрасывается не в основной процедуре программы а внутри обработчика прерывания.