Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2010, 13:47   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию прерывание 00h

Добрый день необходимо написать обработчик который будеи выводить error когда какая-либо программа будет производить деление на 0.
Написала:
Код:
.model tiny
.code
org 100h
main:
;=====================================================================================
;			Ї®«гзҐ*ЁҐ *¤аҐб* в*Ў«Ёжл ўҐЄв®а®ў ЇаҐалў**Ё©
;=====================================================================================
	push es
	xor ax,ax
	mov es,ax
;=====================================================================================
;			б®еа**Ґ*ЁҐ бв*а®Ј® ўҐЄв®а*
;=====================================================================================
	mov ax,word ptr es:[00h]
	mov word ptr old_handler,ax
	mov ax,word ptr es:[00h+2]
	mov word ptr old_handler+2,ax
;=====================================================================================
;	§*ЇЁбм *®ў®Ј® ўҐЄв®а*
;=====================================================================================
	mov ax,cs
	mov word ptr es:[00h*4+2],ax
	mov ax,offset handler
	mov word ptr es:[00h*4],ax
;=====================================================================================
;		®бв*ў«Ґ*ЁҐ Їа®Ја*¬¬л १Ґ¤Ґ*в*®
;=====================================================================================
	pop es
	mov bx,offset last_byte
	int 27h
;=====================================================================================
;			*®ўл© ®Ўа*Ў®взЁЄ
;=====================================================================================
handler:
	push es ds si di cx bx dx ax
	
	mov ax, cs
     	mov ds, ax
     	mov ax, 0B800h
     	mov es, ax
     	mov si, offset message
     	xor di, di
     	mov cx, msg_len
     	rep movsb
;=====================================================================================
;			§*ўҐаиҐ*ЁҐ ®Ўа*Ў®вЄЁ
;=====================================================================================
end_handler:
	mov al,20h     
      out 20h,al  
      pop ax dx bx cx di si ds es
      iret
      
      
      old_handler dd ?
      t db ?
      message db 'E',0Ch,'R',0Ch,'R',0Ch,'O',0Ch,'R',0Ch
      msg_len = $ - message
last_byte:
end main
Вот только после того как выводит error нет корректного завершения программы которая вызвала прерывание. Как исправить?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 20.05.2010, 13:56   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

а как вы хотите чтобы работало? самое простое вызвать перехваченный обработчик после вывода сообщения
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 20.05.2010, 14:16   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

то есть в конце сделать так:
Код:
      jmp dword ptr cs:old_handler
      iret
Мне нужно чтоб программа допустим деления прост завершилась, а управление было переданно обратно dos
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 20.05.2010, 16:19   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

не получается. Программа пишет error, а затем dosbox виснет
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 20.05.2010, 16:30   #5
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

такой должен быть конец программы
Код:
end_handler:
      pop ax dx bx cx di si ds es
      jmp dword ptr cs:old_handler


old_handler dd ?
      t db ?
      message db 'E',0Ch,'R',0Ch,'R',0Ch,'O',0Ch,'R',0Ch
      msg_len = $ - message
last_byte:
end main
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 20.05.2010, 16:40   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

не работает, выдает error и виснет.
Вот код:
Код:
.model tiny
.code
org 100h
main:
;=====================================================================================
;			получение адреса таблицы векторов прерываний
;=====================================================================================
	push es
	xor ax,ax
	mov es,ax
;=====================================================================================
;			сохранение старого вектора
;=====================================================================================
	mov ax,word ptr es:[00h]
	mov word ptr old_handler,ax
	mov ax,word ptr es:[00h+2]
	mov word ptr old_handler+2,ax
;=====================================================================================
;	запись нового вектора
;=====================================================================================
	mov ax,cs
	mov word ptr es:[00h*4+2],ax
	mov ax,offset handler
	mov word ptr es:[00h*4],ax
;=====================================================================================
;		оставление программы резедентно
;=====================================================================================
	pop es
	mov bx,offset last_byte
	int 27h
;=====================================================================================
;			новый обработчик
;=====================================================================================
handler:
	push es ds si di cx bx dx ax
	
	mov ax, cs
     	mov ds, ax
     	mov ax, 0B800h
     	mov es, ax
     	mov si, offset message
     	xor di, di
     	mov cx, msg_len
     	rep movsb
;=====================================================================================
;			завершение обработки
;=====================================================================================
end_handler:
      pop ax dx bx cx di si ds es
      jmp dword ptr cs:old_handler

      
      old_handler dd ?
      t db ?
      message db 'E',0Ch,'R',0Ch,'R',0Ch,'O',0Ch,'R',0Ch
      msg_len = $ - message
last_byte:
end main
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прерывание в Си Misha_M. Помощь студентам 2 04.02.2010 20:11
Прерывание приложения cherry25 БД в Delphi 6 21.08.2009 08:34
6 прерывание ленусик Фриланс 1 03.06.2008 16:22
6 прерывание ленусик Помощь студентам 5 30.05.2008 16:57