Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для ЗасланеЦ
2 / 2 / 1
Регистрация: 11.12.2012
Сообщений: 94

Перехват прерывания int 21h

03.11.2015, 00:45. Показов 4205. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Немного решил поэкспериментировать.
Есть два случая для сравнения.

Первый случай (работает):
Перехватываем прерывание - prog01.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h
 
Begin:
 
 jmp INIT
 
 Int21_proc proc
  cmp ah, 9
  jz OK_LAB
  jmp dword ptr cs:[Int21_addr]
 
  OK_LAB:
  push ds
  push dx
  push cs
  pop ds
 
  mov dx, offset My_str
  pushf
  call dword ptr cs:[Int21_addr]
 
  pop dx
  pop ds
 
  iret
 
  My_str db 0Ah, 0Dh, 'Взломано_!', 0Ah, 0Dh, '$'
 
  Int21_addr dd ?
 Int21_proc endp
 
 INIT:
 mov ax, 3521h
 int 21h
 
 mov word ptr Int21_addr, bx
 mov word ptr Int21_addr + 2, es
 
 mov ax, 2521h
 mov dx, offset Int21_proc
 int 21h
 
 mov dx, offset INIT
 int 27h
 
CSEG ends
end Begin

Тестируем - test01.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h
 
Begin:
 
 mov ah, 9
 mov dx, offset Mess
 int 21h
 
 int 20h
 
 Mess db 0Ah, 0Dh, 'My string.', 0Ah, 0Dh, '$'
 
CSEG ends
end Begin


Второй случай (работает):
Перехватываем - prog02.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h
 
Begin:
 
 jmp INIT
 
 Int21_proc proc
  cmp ah, 0FFh
  jnz NO_LAB
  mov al, 0FFh
  jmp QUIT
 
  NO_LAB:
;  pushf
;  call dword ptr cs:[Int21_addr]
  jmp dword ptr cs:[Int21_addr]
 
  QUIT:
  iret
 
  Int21_addr dd ?
 Int21_proc endp
 
 INIT:
 mov ax, 3521h
 int 21h
 
 mov word ptr Int21_addr, bx
 mov word ptr Int21_addr + 2, es
 
 mov ax, 2521h
 mov dx, offset Int21_proc
 int 21h
 
 mov dx, offset INIT
 int 27h
 
CSEG ends
end Begin

Тестируем - test02.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h
 
Begin:
 
 mov ah, 0FFh
 int 21h
 cmp al, 0FFh
 je PRINT_OK
 
 mov ah, 9
 mov dx, offset No_resid
 int 21h
 jmp QUIT
 
 PRINT_OK:
 mov ah, 9
 mov dx, offset Ok_resid
 int 21h
 
 QUIT:
 int 20h
 
 No_resid db 0Ah, 0Dh, 'Резидент еще не загужен.', 0Ah, 0Dh, '$'
 Ok_resid db 0Ah, 0Dh, 'Резидент в памяти!', 0Ah, 0Dh, '$'
 
CSEG ends
end Begin


Не могу понять, почему если во втором случае в prog02.asm заменить
Assembler
1
  jmp dword ptr cs:[Int21_addr]
на
Assembler
1
2
  pushf
  call dword ptr cs:[Int21_addr]
попытка запуска prog02.com в DOSBox приводит к вылетанию из NortonCommander с сообщением "Unable to read message file". Теперь не возможно запустить файл nc.exe - выходит тоже сообщение. Еще пропадает история команд в консоли. Исправляется перезагрузкой DOSBox. Но все же, после запуска prog02.com после замены вызова оригинального обработчика тестовая программа работает. Отладчики AFD и CodeView глючат/вылетают.

Что не так в замене вызова
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2015, 00:45
Ответы с готовыми решениями:

Резидентная программа - перехват прерывания int 21h ah=09h
Задание: перекрыть 9 функцию 21 прерывания в assembler. Помогите, плиз, разобраться как правильно ставить перекрывание. Решил с самого...

Перехват прерывания int 21h ah=0Ah: во вводимой строке продублировать все гласные буквы
Привет всем, задали тут задачку: -Переопределить десятую функцию прерывания 21h таким образом, чтобы в вводимой строке были...

Перехват int 21h
Добрый день. Заменяю обработчик 21-ого прерывания на свое, где я вызываю старый обработчик, однако... Мое "Hi!" он не выводит...

4
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
03.11.2015, 07:03
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

ЗасланеЦ, многие функции DOS (функция 9 не входит в их число) возвращают статус значением флага Carry: если CF=1, то произошла ошибка, если CF=0, то функция отработала успешно. Замени
Цитата Сообщение от ЗасланеЦ Посмотреть сообщение
Assembler
1
2
QUIT:
 iret
на
Assembler
1
2
QUIT:
 retf 2
и будет тебе счастье.
1
 Аватар для ЗасланеЦ
2 / 2 / 1
Регистрация: 11.12.2012
Сообщений: 94
03.11.2015, 15:41  [ТС]
Argogo, попробовал ваш совет, все действительно работает. Отладчик работает также корректно

Только у меня возникло пара вопросов:
1) почему байты флагов в стеке больше не нужны?
2) при чем здесь флаг переноса?
0
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
03.11.2015, 18:11
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Цитата Сообщение от ЗасланеЦ Посмотреть сообщение
1) почему байты флагов в стеке больше не нужны?
потому что
Цитата Сообщение от Argogo Посмотреть сообщение
многие функции DOS (функция 9 не входит в их число) возвращают статус значением флага Carry: если CF=1, то произошла ошибка, если CF=0, то функция отработала успешно.

Цитата Сообщение от ЗасланеЦ Посмотреть сообщение
2) при чем здесь флаг переноса?
потому что
Цитата Сообщение от Argogo Посмотреть сообщение
многие функции DOS (функция 9 не входит в их число) возвращают статус значением флага Carry: если CF=1, то произошла ошибка, если CF=0, то функция отработала успешно.
я уже устал писАть по нескольку раз одно и тоже. Или я плохо объясняю, или меня читают "по диагонали".
0
 Аватар для ЗасланеЦ
2 / 2 / 1
Регистрация: 11.12.2012
Сообщений: 94
03.11.2015, 22:00  [ТС]
Это же простейшая истина, дошло наконец !

При безвозвратном дольнем переходе на оригинальный обработчик он сам возвращает результат (флаги).
При использовании дальнего вызова оригинального обработчика, обязанность по передаче результата его работы дальше во вне лежит на моем обработчике.

При использовании iret мой обработчик ничего не возвращает, в то время как вызывающие его программы ожидают возврат. Вот почему при запуске prog02.com все стало глючить и зависать.

спасибо Argogo

Аллелуйа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.11.2015, 22:00
Помогаю со студенческими работами здесь

Перехват int 21h
Подскажите пожалуйста. Как передать управление оригинальному обработчику 21h? CSEG Segment ASSUME CS:CSEG org 100h begin: ...

Перехват int 21h
com 16 bit .286 ASKII_code_key_check equ 'A' ASKII_code_key equ 'B' number_handler_int21_02h equ 02h ...

Обработчик прерывания int 21h (по книге Калашникова)
Доброе время суток, я чтиаю книгу Калашникова-Ассемблер и уже втрой день не могу понять почему обработчик не перехватывает прерывания и не...

Резидентный обработчик функции ah=09h int 21h - вывод строки "My String"
Помогите пожалуйста Надо написать резидентную программу, которая будет активироватьcя при попытки программ вывести строку на экран...

Резидент: Вывод таблицы векторов прерывания не используя int 21H
Нужно вывести на экран Ms DOs таблицу векторов прерывания НЕ используя int 21H! так что я предполагаю через int 10H.. уже неделю с этим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 03.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 03.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 01.04.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru