Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
ЗасланеЦ
1 / 1 / 1
Регистрация: 11.12.2012
Сообщений: 74
1

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

03.11.2015, 00:45. Просмотров 1119. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2015, 00:45
Ответы с готовыми решениями:

Вывод на экран. Перехват прерывания.
Очистить экран. Вывести несколько строк произвольного текста. Пе- рехватить прерывание экрана (Int...

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание...

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

перехват прерывания
напишите пожалуйста почему перехват прерывания происходит именно в этой строчке int 16h ...

Глобальный перехват аппаратного прерывания
Такой вопрос: обычный перехват прерывания клавиатуры (написанный под ДОС) работает только в рамках...

4
Argogo
643 / 244 / 41
Регистрация: 29.03.2013
Сообщений: 537
03.11.2015, 07:03 2
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

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

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

Решение

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

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

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

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

спасибо Argogo

Аллелуйа
0
03.11.2015, 22:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 22:00

Прерывания
написал программу по преобразованию нажатой клавиши в скан-код. В принципе это сделал на турбо с++...

C++ и прерывания
Возникла,такая ситуация:при выполнении прерывания (int 10h) в Visual studio и Borland C++ всплывают...

Прерывания
Знатоки assemblera помогите написать программку Замаскировать прерывания от клавиатуры. По...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru