Консультация № 143192
06.09.2008, 12:37
0.00 руб.
07.09.2008, 22:07
0 0 0
Уважаемые специалисты, почему программа не реагирует на ctrl+break, и что сделать, чтобы реагировала? Программа выводит 'a' с задержкой и завершается на ctrl+c, но если сначала нажать ctrl+break. то зацикливается на выводе (наверное, нужно очищать буфер, только как?). Нужно, чтобы программа прерывала цикл при каждом нажатии ctrl+break и показывала сообщение 'break', затем цикл вывода продолжался.

data segment
;в сегменте данных хранится старый вектор прерывания ctrl break
sym db 'a'
breakmes db 'B', 4, 'R', 4, 'E', 4, 'A', 4, 'K', 4
vec1bh dd 0
offs dw 12*80*2+37*2
;mesg db 'BREAK$'
data ends

sseg segment stack
db 200 dup(?)
sseg ends

code segment
assume cs:code,ds:data, ss:sseg
begin:
mov ax,data
mov ds,ax
;определяем значение вектора 1bh, сохраняем его
mov ax,351bh
int 21h
mov word ptr vec1bh,bx
mov word ptr vec1bh+2,es
;устанавливаем новое значение векторов
push ds
push cs
pop ds
mov ax,251bh
lea dx,break
int 21h
mov ax,2523h
lea dx,ctrlc
int 21h
pop ds

ring:
mov ah,02h
mov dl,sym
int 21h
;задержка
xor ax,ax
xor bx,bx
xor dx,dx

mov ah,0
int 1ah
add dx,36
mov bx,dx

repeat:
int 1ah
cmp dx,bx
jne repeat

jmp ring

;восстанавливаем старое значение вектора
ctrlc proc
lds dx,vec1bh
mov ax,251bh
int 21h
mov al,20h
out 20h,al
;выходим в DOS
mov ax,4c00h
int 21h
ctrlc endp

;процедура прерывания по ctrl break
break proc
push ax
push es
push cx
push si
push di
push ds
;Нужно вывести аварийное сообщения методом прямого доступа
;к видеопамяти. Использование этого метода обусловлено невозможностью
;использования соответсвующих функций DOS (по утверждению автора)
mov ax,0b800h ;адрес видеобуфера
mov es,ax ;настройка сегмента es
mov ax,seg offs ;настройка сегмента ds для ;
mov ds,ax ;возможности доступа к данным
mov di,offs ;позиция вывода на экран
lea si,breakmes ;загрузка адреса сообщения
mov cx,10 ;число выводимых байтов
rep movsb ;пересылка сх байт из адреса

;ниже вывод строки др. способом (на самом деле работает)
;mov ax,data
;mov ds,ax
;mov ah,09h
;mov dx,offset mesg
;int 21h
mov al,20h
out 20h,al
pop ds
pop di
pop si
pop cx
pop es
pop ax
iret
break endp

code ends
end begin

Обсуждение

Форма ответа