Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: установка прерывания  (Прочитано 24080 раз)
0 Пользователей и 1 Гость смотрят эту тему.
taya
Гость
« : 28-11-2007 12:16 » 

день добрый! Прошу помощи . У меня почему-то не работают примеры, которые я вырулила из инета  по установкам прерываний. Причем  ни один не работает. Я нашла синтаксис, пыталась просмотреть дебугером испоняемый код. Когда  установленное прерывание вызываю как подпрограмму- то работает, а  если как  прерыванеи- нет. Не найду причину, прошу помочь.
Один из примеров  брала  по этой ссылке
http://nickp.fatal.ru/index.php?page=./bibl/assembler/asmtut5.htm
по  другой  брала  следующий пример. В комментариях те опреаторы ,что пыталась  исполнять. Интересно, у кого-то он работать будет? Буду признательна  за  ответы.

code segment use16
assume CS:code,DS:data
;Главная процедура
main proc
mov AX,data   ; Инициализация сегментного
mov DS,AX     ; регистра DS
;Сохраним исходный вектор
mov AH,35h    ; Функция получения вектора
mov AL,60h    ; Номер вектора
int 21h
mov word ptr old_08,BX ; Смещение исходного обработчика
mov word ptr old_08+2,ES ; Сегмент исходного обработчика
;Установим наш обработчик
mov AH,25h    ;Функция заполнения вектора
mov AL,60h
mov DX,offset new_08 ; Смещение нашего обработчика
;    call new_08
push DS                    ; Сохраним DS=data
push CS                    ; Перепишем CS в DS
pop DS                      ; через стек. DS:DX->new_08
;mov AX,seg new_08  ; Получим сегмент с процедурой new_08
;mov DS,AX                 ;  Перепишем его в DS
int 21h
pop DS                         ; Восстановим DS=data
                               ; Продолжение основной программы
; Перед завершением программы восстановим исходный вектор
lds DX,old_08      ; Заполним DS:DX из old_08
mov AH,25h         ; Функция заполнения вектора
mov AL,60h         ; Номер вектора
int 21h
mov AH,01h      ; Функция DOS вывода на экран
int 21h
mov AX,4C00h    ;Функция завершения программы
int 21h
main endp
;Процедура обработчика прерываний
new_08 proc
push AX         ;Сохраним исходное значение AX
mov AH,0Eh      ; Функция вывода символа
mov AL,'5'       ; Выводимый символ
int 10h          ; Переход в BIOS
mov AL,20h      ; Разблокировка прерываний
out 20h,AL       ; в контроллере прерываний
pop AX           ; Восстановим AX
iret             ; Возврат в прерванную програму
new_08   endp

data segment
old_08  dd 0   ; Ячейка для хранения исходного вектора
data ends

stk segment
db 256 dup(0)
stk ends
code ends
 end main

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 28-11-2007 12:38 » 

Код:
mov AX,4C00h    ;Функция завершения программы
int 21h
Насколько я помню, для выхода нужно было применять 27h прерывание. С установкой резидентной части. А так программа просто выходит и ОС переназначает память следуюшему запушенному процессу.
Код:
mov AH,0Eh      ; Функция вывода символа
mov AL,'5'       ; Выводимый символ
int 10h          ; Переход в BIOS
Использовать прерывание в прерывании не есть хорошо. Тем более контроллер прерываний заблокирован.
И еше один момент, Windows многие веши просто будет блокировать. Так что играться с прерываниями нужно только в MS-DOS.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
taya
Гость
« Ответ #2 : 28-11-2007 12:48 » 

у меня есть и  такой  пример, с 27 прерыванием, но почему  то тоже ничего не происходит. Я ж их сама  не писала, а с книжек взяла Улыбаюсь А у вас  он запустится? Пожалуйста, посмотрите.
Cseg segment                        ;Начало сегмента Cseg.
Assume cs:Cseg,ds:Cseg,ss:Cseg      ;Все сегментные регистры
                                    ;указывают на Cseg.
org 256                             ;PSP
Begin:                              ;Начало "процедуры" Begin.
jmp Metka1                          ;Переход на метку Metka1.

Vivod proc                          ;Именно эта процедура и есть
                                    ;обработчик.
push ax                             ;Следует сохранить все регистры,
push dx                             ;которые изменяются в процедуре.

Bzzzz:
mov ah,6                            ;
mov dl,7                            ;Звоним.
int 21h                             ;
loop Bzzzz

mov ah,7                            ;Ждём нажатия клавиши.
int 21h                             ;

pop dx                              ;Восстанавливаем регистры.
pop ax                              ;

iret                                ;
Finish equ $                        ;Эта отметка нужна для работы 27h
Vivod endp

Metka1:
mov dx,offset Vivod                 ;
mov ah,25h                          ;Устанавливаем адрес нашей
mov al,60h                          ;процедуры на вектор 60h.
int 21h                             ;

lea dx,Finish                       ;Завершить работу оставшись
int 27h                             ;резидентной.

Cseg ends
End Begin 

Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #3 : 28-11-2007 15:14 » 

Твой обработчик врядли сработает больше одного раза. Перед выходом из прерывания надо сбросить контроллер прерываний. Поскольку ты перехватываешь  прерывания от клавиатуры - то для этого перед выходом достаточно вызвать старый обработчик. Там внутри всё завершится нормально.
« Последнее редактирование: 28-11-2007 15:46 от Tuborg » Записан
taya
Гость
« Ответ #4 : 28-11-2007 15:26 » 

я взяла  примеры  из книг, там  так  было
Записан
taya
Гость
« Ответ #5 : 28-11-2007 15:27 » 

сайт Пономарева http://nickp.fatal.ru/index.php?page=./bibl/assembler/asmtut5.htm
Записан
taya
Гость
« Ответ #6 : 28-11-2007 15:35 » 

вот по  этой ссылке http://www.hardline.ru/selfteachers/Info/Programming/!Assembler/GL3/Index1.htm
сам вид обработчика

; Обработчик прерываний для примера 3-3

new_08 proc

push AX      ;Сохраним исходное значение AX

mov AH,0Eh   ; Функция вывода символа

mov AL,'@'     ; Выводимый символ

int 10 h            ; Переход в BIOS

mov AL,20h    ; Разблокировка прерываний

out 20h,AL      ; в контроллере прерываний

pop AX           ; Восстановим AX

iret                   ; Возврат в прерванную программу

new_08  endp

Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #7 : 28-11-2007 15:51 » 

сорри... я думал клавиатуру перегружаешь.... а у тебя просто программное прерывание тогда щас повнимательнее гляну
Записан
taya
Гость
« Ответ #8 : 28-11-2007 15:54 » 

дык, как бы есть... в том привере с чего сыр бор начался. Здесь  что то другое, наверное  что то связано с  16 разрядной дос , 32 разрядной  виндой, и  может еще  какие то параметры.
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #9 : 28-11-2007 15:54 » 

Я не совсем понял 2 вещи:
1) ты работаешь из чистого DOS?
2) Откуда ты вызываешь своё прерывание?
 ты запускаешь отдельно прогу для перегрузки прерывания? а потом отдельную прогу для вызова этого прерывания? И как ты обращаешься к своему обработчику как к процедуре? преведи пример текста где ты обращаешься к своему обработчику.
Записан
taya
Гость
« Ответ #10 : 28-11-2007 15:56 » 

Мне нужен простой  пример для сдачи преподу, но именно:
1. установка собственного прерываняи
2. вызов  этого прерывание
3. очистка  его же
 а что там  это прерывание  будет делать не очень то важно:)
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #11 : 28-11-2007 15:57 » 

эээ... просто так тут никто делать ничего не будет... для этого есть раздел "Работа". Тут могут разве что терпеливо помочь тебе что-то сделать, а не вместо тебя.
Записан
taya
Гость
« Ответ #12 : 28-11-2007 15:59 » 

1. я  запускаю в ОС винды
2. я  запускаю саму  прогу  
3. есть прога  для его вызова, но  она у меня снимается по сообщению - проц выполнил недопустимую операцфию - стандартная когда не  работает  дос


Assume cs:Cseg,ds:Cseg,ss:Cseg
org 256
Begin:

;mov cx,5
int 60h

mov ax,4c00h
int 21h

Cseg ends
End Begin  
Записан
taya
Гость
« Ответ #13 : 28-11-2007 16:02 » 

да я  и не прошу вместо меня,по  заданию я  их уже нашла из инета, но  немогу  запустить, я  думаю что мне кк то из под доса  бы  их запустить, там каких то директив  не хватает, я  думаю Улыбаюсь
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #14 : 28-11-2007 16:04 » 

под досом бы всё работало.... а прерывание видимо винда не даёт тебе перегрузить. Я думаю в этом вся причина.
Записан
taya
Гость
« Ответ #15 : 28-11-2007 16:06 » 

вот  как   я это преподу скажу? Улыбаюсь))  он то все  знает
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #16 : 28-11-2007 16:07 » 

http://ykhwong.x-y.net/cvs/frame.html - вот отсюда скачай последнюю версию DOSBoxa... и там пиши и работай со своей прогой если нет под рукой нормального DOS

у препода то под досом будешь показывать?

http://www.msu.edu/%7Eyootaewo/20071128.rar - более точная ссылка
Записан
taya
Гость
« Ответ #17 : 28-11-2007 16:08 » 

сегодня  буду уходить, завтра  еще  поэксперементирую, кстати у меня ка кбы  и получилось вывести  какой то символ, но  в голове  уже цикл от тасования  операторов, спасибо,что отозвались
Записан
taya
Гость
« Ответ #18 : 28-11-2007 16:09 » 

завтра  возьму , до завтра
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #19 : 28-11-2007 16:09 » 

символ выведешь я думаю и под виндой.... вот только под виндой точняк 25я и 35я функции дос не работают (перегрузка векторов прерываний)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 29-11-2007 06:47 » 

Еще момент.

Bzzzz:
mov ah,6                            ;
mov dl,7                            ;Звоним.
int 21h                             ;
loop Bzzzz

Команда loop использует CX в качестве обратного счетчика. Не вижу в примере присвоение CX - непорядок.
« Последнее редактирование: 29-11-2007 08:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
taya
Гость
« Ответ #21 : 29-11-2007 07:31 » 

привет всем, смотрю ваши ответы
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #22 : 29-11-2007 10:20 » 

Ну с присвоением фигня на самом деле... сколько то прога отработает... что то же в CX должно лежать... правда... может часто и 0 лежать... тогда точняк непорядок =)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #23 : 29-11-2007 22:34 » 

Насколько я помню по учебнику. Никаких лишних телодвижений в обработчике прерывания. Быстренько получил данные и обработал результат и вышел. Этот Bzzzz явно будет тормозить систему.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines