Assembler / P16
.pdf11
; обработчик прерывания при ошибке деления divide_overflow PROC
sti |
; Разрешить внешние прерывания |
mov idiv_err,1 ; Установить индикатор ошибки |
|
mov bp,sp |
; В BP - адрес IP, сохраненного в стеке, |
; это адрес команды idiv bx (код F7 FB занимает два байта) add word ptr [bp], 2 ; теперь IP показывает на следующую команду
iret divide_overflow ENDP
start: mov ax,@data mov ds,ax
;Получить вектор прерывания для ошибки при делении (тип 0) mov al,0
DOS 35h
mov ip_old,bx ; Сохранение mov cs_old,es ; вектора
;Установить новый вектор прерывания
mov bx,ds ; сохранить DS mov al,0
mov dx, SEG divide_overflow mov ds,dx
mov dx, OFFSET divide_overflow DOS 25h
mov ds,bx; Восстановить DS ; Первый набор
eval x1,y1,z1,v1,err1
; Второй набор
eval x2,y2,z2,v2,err2
; Третий набор
eval x3,y3,z3,v3,err3
; Четвѐртый набор
eval x4,y4,z4,v4,err4
; Восстановить вектор прерывания mov al,0
mov dx,ip_old mov ds,cs_old DOS 25h
;
exit
END start
Возникает вопрос, как в TD отлаживать процедуру обработки прерывания по ошибке деления? Если выполнять программу пошагово (нажимая F7), то в эту процедуру мы не попадем. В процедуре надо сделать точку останова (Breakpoint). Поставьте курсор на команду sti и нажмите клавишу F2. Строка будет выделена красным цветом. (Повторное нажатие на F2 отменит точку останова.) Запустите программу на выполнение (F9). Произойдет останов на команде sti. Далее можно изучать работу программы с помощью пошагового
12
выполнения. (Впрочем, можно было обойтись и "старыми запасами": поставить курсор на sti и нажать F4.)
Макросредства языка Си. …….
