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

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", К.Г. Финогенов.