Приогаммирование таймера будильника
Как грится - F1... т.е. ХЕЛП, плиииз :)
Вычитал такую интересную функцию где-то по адресам возле таймера (в БИОСе), мож кто работал? Я не понял одного: как переадресовать вектор на свой обработчик? И как вообще сделать обработчик прерываний? В данном случае заголовок проги-будильника...
Как грится - F1... т.е. ХЕЛП, плиииз :)
насколько я помню - подменить в таблице прерываний адрес подпрограммы, которая вызывается по этому прерыванию.
насколько я помню - подменить в таблице прерываний адрес подпрограммы, которая вызывается по этому прерыванию.
Насколько я помню смотри в сторону 25h
Насколько я помню смотри в сторону 25h
можно. а можно и ручками :)
можно. а можно и ручками :)
Ой, вспомнил. В книге Нортона в бородатом году было описано три способа установки прерываний, но только один из них был легальным (т. е. через систему). Тогда упоминмалось, что установка векторов вручную может вызвать конфликт при работе в многозадачной среде. Правда, в то время это были только слова, а сегодня есть реальная возможность проверить на практике, будет работать или нет. Да еще и не в одной многозадачной среде. ;)
Ой, вспомнил. В книге Нортона в бородатом году было описано три способа установки прерываний, но только один из них был легальным (т. е. через систему). Тогда упоминмалось, что установка векторов вручную может вызвать конфликт при работе в многозадачной среде. Правда, в то время это были только слова, а сегодня есть реальная возможность проверить на практике, будет работать или нет. Да еще и не в одной многозадачной среде. ;)
а какой третий???? :)
я (не в бородатом году, но тоже не вчера) изучал это дело по справочнику Джордейна для IBM PC... там только два способа было. кстати я тогда думал, что чем сложнее способ, тем он круче и делал все только руками... эх...
а какой третий???? :)
Ой, я и не помню уже. Кажется, у него был вариант через MOV и был через STOSW.
Ой, я и не помню уже. Кажется, у него был вариант через MOV и был через STOSW.
а... ну это все равно видимо две разновидности ручной подмены адреса в таблице прерываний...
насколько я помню - подменить в таблице прерываний адрес подпрограммы, которая вызывается по этому прерыванию.
А как узнать адрес своей подпрограммы? Мож у кого исходники есть?
а... ну это все равно видимо две разновидности ручной подмены адреса в таблице прерываний...
Не было бы у него про три способа написано - не запомнил бы.:)
А как узнать адрес своей подпрограммы? Мож у кого исходники есть?
:D :D :D Более смешного высказывания не слышал никогда! :)
Извиняюсь за оффтоп.
Работать будет. А возникновение конфликтов возможно только в том случае, если прерывание будильника (irq8 ) уже используется другой программой.
:D :D :D Более смешного высказывания не слышал никогда! :)
Поясняю на пальцах: может у кого есть исходник этой функции будильника, чтобы был пример перехода на свою подпрограмму.
Так лучше?
Поясняю на пальцах: может у кого есть исходник этой функции будильника, чтобы был пример перехода на свою подпрограмму.
Так лучше?
а самому слабо поискать? в ветке упоминалось 2 автора. набрать в google "Джордейн IBM PC справочник" не позволяют религиозные убеждения?
Поясняю на пальцах: может у кого есть исходник этой функции будильника, чтобы был пример перехода на свою подпрограмму.
Так лучше?
Код обработчика прерывания:
; ----------- твой код ------------- ;
;Send EOI
mov al, 0x20
out 0x20, al
pop ax
iret
Пропиши адрес на этот обработчик в таблице векторов прерываний. Чтобы избежать конфликтов с резидентными программами, необходимо перед изменением таблицы векторов запомнить адрес "старого" обработчика irq8, и делать дальний прыжок на него после выполнения твоего кода.
Поясню, что всё вышесказанное верно только для реального режима.