Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
ACTIONFENIX
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
Завершенные тесты: 1
1

[AFDPRO] Найти INT 8 и объяснить, как он работает

21.10.2018, 00:25. Просмотров 866. Ответов 6
Метки нет (Все метки)

Дали задание найти прерывание INT 8(системный таймер) через AFDPRO в BIOS, обосновать, что оно находится именно в BIOS и объяснить по коду, как оно работает. Само прерывание я нашел (CE03:001F). Та его часть, которая должна находится в BIOS, находится начиная с адреса F000:FEA5, но теневой BIOS идет только начиная с FE00:0000. Или я не туда попал, или я что-то не понимаю. И я также искал в интернете принцип работы INT 8 (детализированный, а не в общих деталях), но ничего не нашел.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2018, 00:25
Ответы с готовыми решениями:

Навигация AFDPro!
В чем разница между Step(F1) и ProcStep(F2) в AFDPro? :umnik: :)

Работа с отладчиком afdpro
Подскажите, как при помощи прерываний отключить мышь и клавиатуру в отладчике, а также может...

Объяснить как работает программа
Объясните пожалуйста как работает ета программа,программу для себя я нашел а вот обьяснить как она...

Объяснить как работает пример
Всем привет, ребята помогите разобраться с примером как он работает (взят из книги) using System;...

Объяснить как работает задача
#include <stdio.h> int main(){ int s,l;//S-расстояние км,L-расход топлива в литрах на км....

6
R71MT
4326 / 1405 / 299
Регистрация: 29.07.2014
Сообщений: 2,448
Записей в блоге: 5
21.10.2018, 07:41 2
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Дали задание найти прерывание INT 8(системный таймер)
для этого берём вектор(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.............
-
Здесь видно, что это адрес 020E:0746..
Теперь дизассемблируем этот адрес и получаем код обработчика:
Код
-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
От куда у тебя появился адрес?
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Само прерывание я нашел (CE03:001F)
1
ACTIONFENIX
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
Завершенные тесты: 1
21.10.2018, 14:16  [ТС] 3
Цитата Сообщение от R71MT Посмотреть сообщение
От куда у тебя появился адрес?
Сообщение от ACTIONFENIX
Само прерывание я нашел (CE03:001F)
В AFDPRO изменил команду по случайному адресу на INT 8 и вызвал ее. Ну и после этого CS:IP поменялось на CE03:001F
Цитата Сообщение от R71MT Посмотреть сообщение
по-смещению 0:20h в IVT будет лежать точка входа в обработчик INT-8
там тоже записано CE03:001F.
Цитата Сообщение от R71MT Посмотреть сообщение
Теперь дизассемблируем этот адрес и получаем код обработчика
У меня код показывает примерно следующий:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CALL 012A
SBB AX,[BX+SI]
XCHG BP, CX
ADD AL,DH
JMP 002C
NOP
ADD AL,CH
STI
ADD [SI],AH
ADD DH,BH
CLC
ADD AL,DH
CALL 012A
XOR [BX+SI],AX
JMP 004C
ADD [BX+SI],AL
ADD [BX+SI],AL
...
Добавлено через 30 минут
Проделал то же самое на Win XP и у меня получилось практически то же, что и у вас, только адрес прерывания немного отличается. Но его код такой же. (до этого я пробовал все это делать из-под доса).
0
R71MT
4326 / 1405 / 299
Регистрация: 29.07.2014
Сообщений: 2,448
Записей в блоге: 5
21.10.2018, 15:41 4
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
там тоже записано CE03:001F.
AFDPro может перехватывать это прерывание, поэтому и адрес подменяет.
Поэтому скачай отладчик AVPUtil: http://old-dos.ru/index.php?page=files&mode=files&do=show&id=5580
В нём есть функция трассировки прерываний, которая вызывается по Ctrl+I
в списке выбираешь INT-8 и получаешь дизассемблерный код, который можешь трассировать по F1/F2
1
Миниатюры
[AFDPRO] Найти INT 8 и объяснить, как он работает  
ACTIONFENIX
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
Завершенные тесты: 1
21.10.2018, 20:52  [ТС] 5
Цитата Сообщение от R71MT Посмотреть сообщение
в списке выбираешь INT-8 и получаешь дизассемблерный код
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
но теневой BIOS идет только начиная с FE00:0000
Цитата Сообщение от R71MT Посмотреть сообщение
Здесь видно, что это адрес 020E:0746..]
Почему прерывание находится просто в RAM? Разве оно не должно находится по адресу где-то FE00:0000 и выше? И я не могу найти его конец. Я искал IRET, но встретил только RET.

Добавлено через 7 минут
upd: я нашел IRET, он просто почему-то находился раньше начала самого прерывания. но все равно не ясно по поводу размещения самого прерывания и то, как оно работает
0
R71MT
4326 / 1405 / 299
Регистрация: 29.07.2014
Сообщений: 2,448
Записей в блоге: 5
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                 ; иначе: выключить флоп!
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Почему прерывание находится просто в RAM? Разве оно не должно находится по адресу где-то FE00:0000 и выше?
Сейчас проверил адрес обработчика из под чистого доса и виртуальной машины,
оказывается реальный адрес у меня (в обоих случаях) 0EEE:0016,
только трассировать код не даёт, а нарывается сразу на LOCK и вылетает с ошибкой.
Дамп выше - это из под виндовой NTVDM, но обработчик видимо правильный, т.к. показывает то, что надо.
2
Миниатюры
[AFDPRO] Найти INT 8 и объяснить, как он работает  
Ethereal
Нарушитель
4521 / 1815 / 235
Регистрация: 17.02.2013
Сообщений: 2,709
27.10.2018, 05:21 7
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Почему прерывание находится просто в RAM? Разве оно не должно находится по адресу где-то FE00:0000 и выше?
Сначала при старте компа BIOS настраивает чтобы прерывание 8 указывало на "FE00:0000 и выше" , но потом загружается MS-DOS и перехватывает прерывание 8. Потом может быть загружается какая резидентная программа и еще раз перехватывает. Образуется цепочка обработчиков прерываний. При этом обработчики прерываний в цепочке могут свой код встраивать не только до входа в обработчик BIOS, но еще и отлавливать управление после выхода из обработчика BIOS. Так-что общем случае будет исполняться код_в_ОЗУ->код_в_BIOS_->код_в_ОЗУ->прерванная_точка. В общем если ты будешь трассировать int 8 , то рано или поздно дойдешь и до адресов BIOS. Просто это будет не сразу.

Добавлено через 4 минуты
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
И я не могу найти его конец. Я искал IRET, но встретил только RET.
А там и не обязательно будет IRET. Скорей всего будет, но не обязательно. Зависит от извращенной фантазии программиста, который это писал.
1
27.10.2018, 05:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2018, 05:21

Потоки. Объяснить как работает код
Вот у меня есть код программы, которая создает два процесса. Первый генерирует ряд натуральных...

Объяснить как работает часть кода
Можно поподробнее как работает этот отрывок кода Я понимаю, что PX растет, до тех пор пока не...

Нужно объяснить как работает алгоритм, по функциям
Ребят подскажите пжл мне нужно объяснить как работает этот алгоритм, по функциям procedure...


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

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

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