· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Перехват прерываний. Неудачи с обучением...

. 1 . 2 . >>

Посл.отвђт Сообщен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 к часам реального времени и прямой записью в видеопамять.

:)))

Я счастлив!!!

%)

С уважением и неподдельной благодарностью. Ворон.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.099