3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
|
|
1 | |
[AFDPRO] Найти INT 8 и объяснить, как он работает21.10.2018, 00:25. Показов 4202. Ответов 6
Метки нет (Все метки)
Дали задание найти прерывание INT 8(системный таймер) через AFDPRO в BIOS, обосновать, что оно находится именно в BIOS и объяснить по коду, как оно работает. Само прерывание я нашел (CE03:001F). Та его часть, которая должна находится в BIOS, находится начиная с адреса F000:FEA5, но теневой BIOS идет только начиная с FE00:0000. Или я не туда попал, или я что-то не понимаю. И я также искал в интернете принцип работы INT 8 (детализированный, а не в общих деталях), но ничего не нашел.
0
|
21.10.2018, 00:25 | |
Ответы с готовыми решениями:
6
Не работает перегрузка индексного оператора [], вместо [int][int] почему то нужно ставить [0][int][int] Как вернутся на шаг назад в отладчике afdpro Объяснить как работает программа Объяснить как работает задача |
Эксперт Hardware
|
|
21.10.2018, 07:41 | 2 |
для этого берём вектор(08) и таблицы прерываний, для чего 08h*04h=20h. Значит по-смещению 0:20h в IVT будет лежать точка входа в обработчик INT-8. Открываем дебуг и вводим адрес:
Код
C:\> debug -d 0:20 0000:0020 46 07 0E 02 0A 04 0E 02-3A 00 98 03 54 00 98 03 F.......:...T... 0000:0030 6E 00 98 03 88 00 98 03-A2 00 98 03 FF 03 0E 02 n............... 0000:0040 A9 08 0E 02 A4 09 0E 02-AA 09 0E 02 5D 04 0E 02 ............]... 0000:0050 B0 09 0E 02 0D 02 DD 02-C4 09 0E 02 8B 05 0E 02 ................ 0000:0060 0E 0C 0E 02 14 0C 0E 02-1F 0C 0E 02 AD 06 0E 02 ................ 0000:0070 AD 06 0E 02 A4 F0 00 F0-37 05 0E 02 41 70 00 C0 ........7...Ap.. 0000:0080 72 10 A7 00 7C 10 A7 00-4F 03 6E 05 8A 03 6E 05 r...|...O.n...n. 0000:0090 17 03 6E 05 86 10 A7 00-90 10 A7 00 9A 10 A7 00 ..n............. - Теперь дизассемблируем этот адрес и получаем код обработчика: Код
-u 020E:0746 020E:0746 E87000 CALL 07B9 020E:0749 06 PUSH ES 020E:074A 1E PUSH DS 020E:074B 50 PUSH AX 020E:074C 52 PUSH DX 020E:074D B84000 MOV AX,0040 020E:0750 8ED8 MOV DS,AX 020E:0752 33C0 XOR AX,AX 020E:0754 8EC0 MOV ES,AX 020E:0756 FF066C00 INC WORD PTR [006C] 020E:075A 7504 JNZ 0760 020E:075C FF066E00 INC WORD PTR [006E] 020E:0760 833E6E0018 CMP WORD PTR [006E],+18 020E:0765 7515 JNZ 077C
1
|
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
|
||||||
21.10.2018, 14:16 [ТС] | 3 | |||||
В AFDPRO изменил команду по случайному адресу на INT 8 и вызвал ее. Ну и после этого CS:IP поменялось на CE03:001F
там тоже записано CE03:001F.
У меня код показывает примерно следующий:
Проделал то же самое на Win XP и у меня получилось практически то же, что и у вас, только адрес прерывания немного отличается. Но его код такой же. (до этого я пробовал все это делать из-под доса).
0
|
Эксперт Hardware
|
|
21.10.2018, 15:41 | 4 |
AFDPro может перехватывать это прерывание, поэтому и адрес подменяет.
Поэтому скачай отладчик AVPUtil: http://old-dos.ru/index.php?pa... ow&id=5580 В нём есть функция трассировки прерываний, которая вызывается по Ctrl+I в списке выбираешь INT-8 и получаешь дизассемблерный код, который можешь трассировать по F1/F2
1
|
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
|
|
21.10.2018, 20:52 [ТС] | 5 |
Почему прерывание находится просто в RAM? Разве оно не должно находится по адресу где-то FE00:0000 и выше? И я не могу найти его конец. Я искал IRET, но встретил только RET.
Добавлено через 7 минут upd: я нашел IRET, он просто почему-то находился раньше начала самого прерывания. но все равно не ясно по поводу размещения самого прерывания и то, как оно работает
0
|
Эксперт Hardware
|
|
21.10.2018, 23:27 | 6 |
Сообщение было отмечено Mikl___ как решение
Решение
Аппаратное прерывание IRQ-0 вызывается каналом(0) м/схемы таймера по каждому тику часов. Обработчик INT-8 в первую очередь обновляет значение тиков в пространстве BIOS по адресу 0:046C, и следит за переполнением таймера по адресу 0:0470. Помимо этого, когда флоп FDD простаивает без операций ввода/вывода, по истечении 2 сек INT-8 выключает его двигатели:
Код
; адрес 0040:006C соответствует адресу 0:046C -u 020E:074D B84000 MOV AX,0040 020E:0750 8ED8 MOV DS,AX ; сегмент BIOS 020E:0752 33C0 XOR AX,AX 020E:0754 8EC0 MOV ES,AX 020E:0756 FF066C00 INC WORD PTR [006C] ; увеличить тик в 0:046C 020E:075A 7504 JNZ 0760 ; если не нуль.. 020E:075C FF066E00 INC WORD PTR [006E] ; иначе увеличить ст.слово ; ;--- Дальше код зависит от текущих настроек канала(0) таймера 020E:0760 833E6E0018 CMP WORD PTR [006E],+18 020E:0765 7515 JNZ 077C 020E:0767 813E6C00B000 CMP WORD PTR [006C],00B0 020E:076D 750D JNZ 077C 020E:076F A36E00 MOV [006E],AX 020E:0772 A36C00 MOV [006C],AX 020E:0775 C606700001 MOV BYTE PTR [0070],01 ; 0:0470 = флаг переполнения таймера 020E:077A 0C08 OR AL,08 ;--- Работа с флопом по адресу 0:0440 020E:077C 50 PUSH AX 020E:077D FE0E4000 DEC BYTE PTR [0040] ; время до выкл.мотора FDD (выкл.когда 0). 020E:0781 750B JNZ 078E ; если не нуль.. 020E:0783 80263F00F0 AND BYTE PTR [003F],F0 020E:0788 B00C MOV AL,0C 020E:078A BAF203 MOV DX,03F2 020E:078D EE OUT DX,AL ; иначе: выключить флоп! оказывается реальный адрес у меня (в обоих случаях) 0EEE:0016 ,только трассировать код не даёт, а нарывается сразу на LOCK и вылетает с ошибкой. Дамп выше - это из под виндовой NTVDM, но обработчик видимо правильный, т.к. показывает то, что надо.
2
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
27.10.2018, 05:21 | 7 |
Сначала при старте компа BIOS настраивает чтобы прерывание 8 указывало на "FE00:0000 и выше" , но потом загружается MS-DOS и перехватывает прерывание 8. Потом может быть загружается какая резидентная программа и еще раз перехватывает. Образуется цепочка обработчиков прерываний. При этом обработчики прерываний в цепочке могут свой код встраивать не только до входа в обработчик BIOS, но еще и отлавливать управление после выхода из обработчика BIOS. Так-что общем случае будет исполняться код_в_ОЗУ->код_в_BIOS_->код_в_ОЗУ->прерванная_точка. В общем если ты будешь трассировать int 8 , то рано или поздно дойдешь и до адресов BIOS. Просто это будет не сразу.
Добавлено через 4 минуты А там и не обязательно будет IRET. Скорей всего будет, но не обязательно. Зависит от извращенной фантазии программиста, который это писал.
1
|
27.10.2018, 05:21 | |
27.10.2018, 05:21 | |
Помогаю со студенческими работами здесь
7
Объяснить как работает пример Объяснить как работает часть кода Прошу объяснить, как оно работает Потоки. Объяснить как работает код Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |