|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 28, 2003 12:17:20 Пытался написать скрипт с перехватом прерывваний. скомпилировался, слинковался, запустился. но перехват прерываний не происходит. не могу понять почему. в тд все нормально (не вижу ошибок) но как определить происходит ли прерывание по таймеру 1ch я не знаю... Листинг из Зубкова дал те же результаты... В абеле о перехвате прерываний умалчиваеться (или файл с 23 главой у меня не полный). Посмотрите плз. код и помогите найти ошибку. Если не сложно - посмотрите я правильно использую адресацию к различным сегментам? С уважением и благодарностью Ворон. Листинг: .386 stacks segment stack 'STACK' db 100h dup (?) stacks ends codes segment 'code' assume cs:codes begin: mov ah,00h mov al,03h int 10h mov ah,35h mov al,1ch int 21h mov bp,offset hoff mov ax,seg datas mov ds,ax mov ds:[bp],bx mov ds:[bp+2],es mov ax,seg procs mov ds,ax mov ah,25h mov al,1ch mov dx,offset newhand int 21h mov ah,01h int 21h mov bp,offset hoff mov ax,seg datas mov es,ax mov ax,es:[bp] mov ds,ax mov dx,es:[bp+2] mov ah,25h mov al,1ch int 21h mov ah,4ch int 21h codes ends datas segment 'DATA' hoff dd (?) way db "timer handler sommoned" wayl equ $-way pos db (?) datas ends procs segment "PROCS" assume cs:procs newhand proc far pusha push es push ds push cs pop ds mov ax,seg datas mov es,ax mov bp,offset pos mov dl,es:[bp] mov ah,13h mov al,00h mov bp,offset way mov cx,wayl int 21h mov bp,offset pos mov ax,es:[bp] inc ax mov es:[bp],ax pop ds pop es popa newhand endp procs ends end |
|
|
Дата: Май 28, 2003 12:19:53 Да еще одно - точка входа 0000:0000. Это нормально? Что то не так сделал? |
|
|
Дата: Май 28, 2003 13:08:36 Первым делом проверь, как происходит выход из нового хандлера. Во-первых, он не вызывает старый хандлер, что странно, так как прерывание 0х1С вроде как "общее". Во-вторых, после хандлера прерывания обычно идет iret. И потом, а нахрена было выводить хандлер в отдельный сегмент непонятного роду-племени? |
|
|
Дата: Май 29, 2003 11:05:19 1. хендлер не вызываеться. (это как то визуально должно быть заметно?) в тд все без видимых ошибок доходит до mov ah,4ch int 21h и выходит. 2. предупреждала что регистры 32 битные, хотя вроде бы это не должно влиять на "правильность" поставил use16. естественно ничего не изменилось. 3. поставил в конце хендлера iret - не помогло. 4. заменил iret на mov ax,seg datas push ax pop ds jmp ds:hoff не помогло. (я правильно передал упр. обработчику-по-умолчанию?) все так же - никаких ошибок, все линкуеться и ничего не работает :-( Подскажите плз в чем может быть дело? |
|
|
Дата: Май 29, 2003 11:14:42 Ой забыл: - надо ставить ЛИБО iret ЛИБО передавать управление обработчику по умолчанию верно? - ***нахрена было выводить хандлер в отдельный сегмент*** - вообще то ни на хрен... просто я учусь и стараюсь попробывать все возможности. тут - адресация между разными сегментами сложнее чем в одном а потому интереснее. Кроме того это "красиво" - процедуры в одном сегменте, данные в другом, код в третьем. Или так делать не стоит. Тогда подскажите почему... - Ошибку в блоке mov bp,offset hoff mov ax,seg datas mov es,ax mov ax,es:[bp] mov ds,ax mov dx,es:[bp+2] mov ah,25h mov al,1ch int 21h уже нашол. Переписал как mov bp,offset hoff mov ax,seg datas mov es,ax mov ax,es:[bp+2] mov ds,ax mov dx,es:[bp] mov ah,25h mov al,1ch int 21h Спасибо что дочитали Буду очень благодарен если поможете разобраться почему не работает... |
|
|
Дата: Май 30, 2003 09:58:45 Кто нибудь плз. отзовитесь - очень надо... |
|
|
Дата: Май 30, 2003 10:36:26 Аноним Май 30, 2003 09:58:45 Я, например, не понимаю где Ваши сообщения, а где не Ваши. Вы не хотите зарегистрироваться? |
|
|
Дата: Май 30, 2003 19:21:58 1. Я приношу свои извинения за эти непонятки - буду подписывать свои сообщения в ручную. 2. зачем так экстремально? - я зарегистрировался а вот с логином определенного рода проблемы... Если вводишь что то левое - не работает, если то что надо вводишь - просто ничего не происходит... Я пишу на пхп и если вы примете мою помощь (и скажете как я могу помочь), то я, вне всяких сомнений, сделаю все что в моих силах. [email=]nemtsev@zeos.net[/email] 3. Все сообщения от **Аноним** тут мои. 4. Очень надеюсь на вашу помощь. С почтением и благодарностью за уделенное внимание. Ворон. |
|
|
Дата: Май 30, 2003 19:22:53 Ой!!! а почему на главной не логиниться?!!! |
|
|
Дата: Май 30, 2003 19:25:11 Система нипель... Ребята - настраивайте сессии... Мое предложение в силе. (Как и надежда на вашу помощь). |
|
|
Дата: Май 30, 2003 19:28:06 Поправка все кроме: Дата: Май 28, 2003 13:08:36 С искренним почтением и надеждой на ответ. |
|
|
Дата: Май 30, 2003 20:01:57 Рекомендую и код, и данные, и стек размещать в одном сегменте, и компилировать все это в com-файл. Передачу управления старому обработчику можно сделать следующим образом: handler: push regs ... pop regs db 0eah;код комманды jmp oldofs dw ? oldseg dw ? или так: handler: push regs ... pushf;так как комманда iret востановит флаги из стека db 9ah;код комманды call oldofs dw ? oldseg dw ? ... pop regs iret Перед установкой нового обработчика необходимо записать в oldseg и oldofs сегмент и смещение старого обработчика. Вызывать функции dos из обработчиков аппаратных прерываний не рекомендуется. Если хочешь определить вызывается ли обработчик или нет, то проще всего записать в видеопамять какой нибудь символ. |
|
|
Дата: Май 31, 2003 13:55:43 Переписал код под СOМ. Внутри обработчика прерываний поставил: push 0b800h pop es mov bp,0004h mov ax,02h mov es:[bp],ax mov ax,00001010b mov es:[bp+1],ax морбочку выводит. Но если начать как то усложнять пример программа дает непредсказуемые и малопонятные результаты. Если пытаться выводить мордочку со сдвигом push 0b800h pop es mov bp,0004h mov ax,02h mov es:[bp+di],ax mov ax,00001010b mov es:[bp+di+1],ax inc di inc di то появляеться 1 - 10 мордочек в разных (непредсказуемых) частях экрана... причем появляються почти одновременно, после чего перестают появляться совсем и напрочь. Когда я пытаюсь усложнить пример (пытаюсь вывести в правом верхнем углу таймер) то курсор просто метаеться вверх - вниз по экрану и ничего более не происходит. Может ли привести к этому то, что я использую прирывания биос (1Ah и 13h), не обладающие повторной входимостью? Помогите пожалуста разобраться в чем дело и как с этим бороться. Листинг с тайиером я привожу ниже. Очень надеюсь на вашу помощь. С благодарностью. Ворон. Листинг: .model tiny .code .386 org 100h start: mov ah,00h mov al,03h int 10h mov ah,35h mov al,1ch int 21h mov bp,offset oldofs mov [bp],bx mov bp,offset oldseg mov [bp],es mov ah,25h mov al,1ch mov dx,offset newhand int 21h loopit: mov ah,0ch mov al,06h mov dl,0ffh int 21h cmp al,00h jnz keypressed jmp loopit keypressed: mov bp,offset oldseg mov ax,[bp] mov ds,ax mov bp,offset oldofs mov dx,[bp] mov ah,25h mov al,1ch int 21h mov ah,4ch int 21h newhand proc far pusha push es push ds push cs pop ds mov ah,02h int 1Ah jc erro mov si,0h mov di,0h mov bp,offset time mov [bp],ch mov [bp+1],cl mov [bp+2],dh timerC: mov bp,offset time mov al,[bp+di] and al,11110000b shr al,04h add al,30h mov bp,offset timebcd mov [bp+si],al inc si mov bp,offset time mov al,[bp+di] and al,00001111b add al,30h mov bp,offset timebcd mov [bp+si],al inc si mov bp,offset timebcd mov al,3ah mov [bp+si], al inc si inc di cmp di,3 jnz timerC mov ah,13h mov al,01h mov cx,timebcdl mov dh,0 mov dl,72d mov bl,00001010b mov bp,offset timebcd int 10h pop ds pop es popa db 0eah; oldofs dw ? oldseg dw ? newhand endp erro: mov ah,13h mov al,01h mov cx,ferr1l mov dx,0 mov bl,00001111b mov bp,offset ferr1 int 10h ret ferr1 db "ERROR: clock isn't work or it is update time now.",0dh,0ah ferr1l equ $-ferr1 time db 3 dup (?) timel equ $-time timebcd db 8 dup (?) timebcdl equ $-timebcd end start |
|
|
Дата: Май 31, 2003 19:40:29 В начале обработки прерывания необходимо сохранить все регистры которые будешь использовать. При повторном вызове обработчика значения в регистрах могут быть совершенно другие, поэтому сохранять что-либо между вызовами можно только в памяти. Перед обращениями к памяти необходимо инициализировать регистр ds. При ссылках к памяти через регистр bp, предполагается что переменная находится в сегменте стека, поэтому, если это не так, нужно ставить префикс переопределения сегмента. Функции биоса переставляют курсор, поэтому он и прыгает по всему экрану. Еще я рекомендую c листом бумаги по шагам пройти обработчик прерывания и посмотреть что будет в стеке перед возвратом из erro. |
|
|
Дата: Июн 1, 2003 15:51:27 Спасибо большое гуру Black_mirror!!! Заработало!!! Я прыгаю на стуле от рабости распевая песни Тома Вейтса в непристойной интерпретации!!! Я не сохранил все необходимые регистры + пришлось заменить фу-и по получению времени и вывода на экран обращениями через порты 70 и 71 к часам реального времени и прямой записью в видеопамять. :))) Я счастлив!!! %) С уважением и неподдельной благодарностью. Ворон. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.099 |