|
1 / 1 / 0
Регистрация: 26.03.2017
Сообщений: 11
|
||||||
TASM Перехват int 21h11.12.2019, 19:18. Показов 5644. Ответов 19
Добрый день. Заменяю обработчик 21-ого прерывания на свое, где я вызываю старый обработчик, однако... Мое "Hi!" он не выводит вообще. Программа виснет.
0
|
||||||
| 11.12.2019, 19:18 | |
|
Ответы с готовыми решениями:
19
Перехват int 21h Перехват int 21h
|
|
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
|
||||||
| 12.12.2019, 16:01 | ||||||
2
|
||||||
|
1 / 1 / 0
Регистрация: 26.03.2017
Сообщений: 11
|
|
| 12.12.2019, 16:51 [ТС] | |
|
Работает, большое спасибо, плюс улетел.
0
|
|
|
Прощай, Мир!
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
|
||||||
| 12.12.2019, 18:59 | ||||||
|
qbfan, сегодня прогноз погоды передовал туман.. наверное, я под него попал и заблудился..
![]() вобщем, решил переделать твой код, чтобы обязательно использовался сегмент данных.. ничего не выводит вообще, программа виснет.. пжл, покажи и выведи меня на правильный путь..
1
|
||||||
|
Модератор
|
||||||
| 12.12.2019, 19:19 | ||||||
0
|
||||||
|
Прощай, Мир!
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
|
|
| 12.12.2019, 19:23 | |
|
ФедосеевПавел, не помогло..
1
|
|
|
Модератор
|
||||||
| 12.12.2019, 20:47 | ||||||
|
Как-то делал перехват
int 1Ch из exe программы. Смысл тот же.Сейчас попробую разобраться. Добавлено через 1 час 22 минуты proc3nt, у меня не получилось устанавливать новый вектор при помощи самого int 21h. А вот всё то же самое, но при прямой записи в память таблицы векторов - отлично работает.
1
|
||||||
|
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
|
|||||||||||
| 13.12.2019, 12:23 | |||||||||||
|
proc3nt Вы пишите
а не нашей программе. поэтому данная идея не работает. (Надо сохранять DS, устанавливать наш DS, в конце прерывания восстанавливать исходный DS) Есть другой простой способ вызывать старое прерывание:
0
|
|||||||||||
|
Модератор
|
||||||
| 13.12.2019, 14:34 | ||||||
|
Думаю, что мы имеем дело с программным прерыванием и регистр ds никто не меняет - иначе бы не распечатывалась строка ds:dx при вызове функции ah=09h.
Мне не удавалось выполнить замену вектора int 21h средствами самого int 21h. Видимо, это связано как-то с внутренним устройством "родного" обработчика. Думаю, чтобы исключить такое влияние, корректнее напрямую заменять вектор. Добавлено через 7 минут Очень может быть, что "родной" обработчик int 21h в некоторых случаях рекурсивно обращается к int 21h уже после замены ds. Поэтому адрес перехода лучше хранить в сегменте кода и выполнять косвенных переход по адресу в переменной из сегмента данных. А вот регистр ds перед переходом - не устанавливать на cs. Поэтому примеры com программ выглядят проще, и не дают представления о происходящем - когда с виду корректная программа, зависает. Добавлено через 38 минут Т.е. так вижу: - адрес оригинального обработчика хранится в сегменте кода - в собственном обработчике перед передачей управления оригинальному обработчику сегмент данных не изменяется (поэтому адрес и храним сегменте кода). Так работает. А предыдущий код из сообщения #7, скорее всего некорректный
1
|
||||||
|
Прощай, Мир!
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
|
||||
| 13.12.2019, 15:32 | ||||
1
|
||||
|
Модератор
|
||||||||||||
| 13.12.2019, 16:05 | ||||||||||||
|
Позже я пояснил, что
Иногда переменную объявляют в коде не просто, как переменную, а как часть инструкции перехода. Т.е. вместо call far Addres пишут инструкцию из отдельных кодов
1
|
||||||||||||
|
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
|
||
| 13.12.2019, 19:54 | ||
|
ФедосеевПавел
Добавлено через 20 минут Извините - запутался.
0
|
||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|
| 13.12.2019, 20:33 | |
|
1
|
|
|
Прощай, Мир!
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
|
||
| 13.12.2019, 21:09 | ||
1
|
||
|
Модератор
|
||
| 13.12.2019, 22:17 | ||
|
Пример - обработчик прерывания 1Ch в теме
Вызов звука по нажатию клавиш Control+C (создание собственного прерывания) В строке 16 переменная с адресом старого вектора объявляется public - для доступа за пределами блока proc, т.е. из основной программы. В строках 55-56 записана инструкция jmp far на старый обработчик. И т.к. возврата в новый обработчик уже не будет (переход к "старому" при помощи jmp, а не call), то никаких ret и iret далее не следует.В данной теме обсуждается переход call far. У этой инструкции другой код, но адрес перехода находится очно в таком же месте.
1
|
||
|
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
|
||||||
| 14.12.2019, 12:59 | ||||||
|
Нет, через DS вызывать старое прерывание DOS нельзя, потому что большое число
функций DOS используют DS:DX в качестве аргумента, в том числе файловые функции и вывод на консоль (как например AH=40h) Так что система неизбежно виснет. Вот моя слегка изменённая программа, в виде COM файла длиной 76 байт. В ней нет префиксов CS:
1
|
||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||||||||||||||
| 14.12.2019, 22:33 | ||||||||||||||||||
sti), а посему поставив после int 21h инструкцию hlt мы получим зависание.В большинстве случаев это, конечно, некритично, и программист, вызывающий прерывание (по крайней мере, такое, которое может менять флаги в каких-то функциях), не должен полагаться на то, что после вызова прерывания какие-либо флаги (кроме тех, которые описаны в документации к вызываемой функции) будут сохранены (ибо желающих перехватывать разные прерывания много и не каждый делает это корректно), тем не менее, лучше не полагаться на других (как в хорошем смысле, так и не очень), а самому делать всё как положено. Если передать управление прерыванию можно в конце, лучше сделать так:
call ds:old21 как call dword ptr ds:old21). У меня лично этот код работает под DOSBox'ом.Но! Мы не можем гарантировать, что кто-либо другой не использует int 21h (например, в таймере или даже сам int 21h может вызывать себя рекурсивно), при этом DS может быть изменён.
2
|
||||||||||||||||||
|
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
||||||
| 14.12.2019, 22:38 | ||||||
|
Можно и DS передать в обработчик.
![]()
1
|
||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||||
| 14.12.2019, 22:44 | ||||||||
pop'а можно заменить на один pop dword ptr cs:[CallerAddr] (386+), это сэкономит 4 байта.
1
|
||||||||
|
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
| 14.12.2019, 22:49 | |
|
это так идея - сильно не пинайте, со стека же как-то извлекаются и аргументы и локальные переменные.
1
|
|
| 14.12.2019, 22:49 | |
|
Помогаю со студенческими работами здесь
20
Резидентный обработчик функции ah=09h int 21h - вывод строки "My String"
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|