DOS-16 TSR на OpenWatcom С++
Пишу сабж. Перевесил прерывание на свой хэндлер. Вызывается исправно.
Как мне в нем посмотреть содержимое регистров, с которыми его вызвали?
__asm
{
mov куданадо,ah
}
if (куданадо==скоканадо) ...
выдает какую-то ерунду (и должно выдавать ерунду, насколько я еще не забыл, там реги пушаются/попаются).
Кто-нибудь, пролечите мой склероз...
А прерывание откуда вызывается? Если параметры передаются через стек, то надо и обращаться к стэку - учитывая при этом, что там уже сидят флаги и адрес возврата.
В прерывания BIOS данные точно передаются через регистры, в прерывания DOS -- насколько помню, тоже. АН -- номер службы, ну и так далее...
Watcom вроде их сам куда-то загоняет, чтобы можно было что-то посчитать (исковеркав все реги), а потом восстановить их при вызове _chain_intr(родное). Думаю, их в стеке можно просто отыскать, но недокументированными вещами заниматься не хочется.
Если я правильно понял, прога написана под защищенный режим. Т.е. производится перехват прерывания 0x21, а потом запуск другой проги которая это прерывание юзает?
DOS-16 :))))))))
Мы перехватываем 21-е и зовем юзерские проги, а они удивляются, что за чудеса вокруг :))
- Тада есть вариант, что пролог функции обработчика сгенеренный компилятором затирает значения нужных регистров. Попробуй описать обработчик целиком на Ассемблере (во внешнем .asm - модуле).
Там никакой стандартной структурки хранящей нету?
Тем более -- там _чейн_интр приходится использовать частенько... кстати, никогда его вручную на АЗМе не делал. Там просто восстановить регистры и лонгджампнуть на "родной" адрес надо или как-то похитрее придется?
__interrupt kak_ego_tam (union INTPACK PblrucTPbl)
{
if (PblrucTPbl.h.ah==скоканада)...
}
Вообще-то, могли бы и напомнить кто-нибудь. Достаточно элементарная вещь...
Ладно, все, хорошо хоть, не забыл, где можно посмотреть, если забуду :)))
Результ достигнут.