Консультация № 29265
09.11.2005, 18:54
0.00 руб.
0 3 3
Здравствуйте уважаемые эксперты, у меня такой вопрос:

- Почему при просмотре через debug, таблица вект.прерываний разная
в разных OS (у ХР - одна, вин98 - другая, MSDOS - третья)(в особенности меня
интересует прерывание BIOS int 09h по адресу 0:24h ???

- В резидентной программе (под ХР или вин98) возникает ошибка вот тут:

....
....
mov ax,2509h ;заменить в таюлице прерываний адрес процедуры int 09h
mov dx,offset _Obrabot ;на адрес _Obrab
int 21h
....
....
ну просто не хочет заменять и всё! Выдает ошидку что в чистом дОСе, что
под любыми виндами
( на прямую тоже не заменяется, типа:
mov es:[24h],offset _Obrab
mov es:[26h],cs

Обсуждение

давно
Посетитель
7438
7205
09.11.2005, 20:58
общий
это ответ
Здравствуйте, Петров Максим Викторович!
1) Да потому что показывается таблица прерываний, заполненной каждой ОСью по-своему. При MSDOS BIOSовские прерывания показывают на BIOS (если не запущены резиденты, перехватывающие их). В Винде же похоже все вектора прерывания показывают на собственный код.
2)Раз показывает, что ошибка, значит так и есть :)
Больше без кода добавить нечего...Только одно предположение - может DS не туда показывает?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.11.2005, 07:16
общий
это ответ
Здравствуйте, Петров Максим Викторович!
Попробуйте всё ли из перечисленных шагов вы выполняли, потому что таким же образом перехватывали 1c интерупт, а он как и 9 от внешнего ус-ва.
; скопировать адрес предыдущего обработчика в переменную old_handler
mov ax,3587h ; АН = 35h, AL = номер прерывания
int 21h ; функция DOS: считать
; адрес обработчика прерывания
mov word ptr old_handler,bx ; возвратить
; смещение в ВХ
mov word ptr old_handler+2,es ; и сегментный
; адрес в ES,
; установить наш обработчик
mov ax,2587h ; АН = 25h, AL = номер прерывания
mov dx,seg int_handler ; сегментный адрес
mov ds,dx ; в DS
mov dx,offset int_handler ; смещение в DX
int 21h ; функция DOS: установить
; обработчик
; (не забывайте, что ES изменился после вызова функции 35h!)
[...]
; восстановить предыдущий обработчик
lds dx,old_handler ; сегментный адрес в DS и смещение в DX
mov ax,2587h ; АН = 25h, AL = номер прерывания
int 21h ; установить обработчик

Неизвестный
10.11.2005, 12:34
общий
это ответ
Здравствуйте, Петров Максим Викторович!

Потому что разная.
Под MSDOS, которая работает в реальном режиме, все честно - это таблица векторов реального режима.
Под виндами все сложнее. Т.к. они работают в защищенном режиме, то для каждой DOS-задачи выделяется свое адресное пространство со своей таблицей векторов прерываний.

Насчет второй части вопроса - код в студию! Потому что в таком виде ответить на него невозможно. По крайней мере у меня никогда не возникало проблем при переопределении 9-го прерывания, что под чистым DOSом, что при эмуляции.

А при изменении вектора через функцию MSDOS ты регистр DS правильно устанавливаешь? А при прямой замене ты прерывания отключаешь на момент изменения таблицы? Что за ошибка возникает?
Форма ответа