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

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

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

Author24 — интернет-сервис помощи студентам
Дали задание найти прерывание INT 8(системный таймер) через AFDPRO в BIOS, обосновать, что оно находится именно в BIOS и объяснить по коду, как оно работает. Само прерывание я нашел (CE03:001F). Та его часть, которая должна находится в BIOS, находится начиная с адреса F000:FEA5, но теневой BIOS идет только начиная с FE00:0000. Или я не туда попал, или я что-то не понимаю. И я также искал в интернете принцип работы INT 8 (детализированный, а не в общих деталях), но ничего не нашел.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2018, 00:25
Ответы с готовыми решениями:

Не работает перегрузка индексного оператора [], вместо [int][int] почему то нужно ставить [0][int][int]
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<ctime>...

Как вернутся на шаг назад в отладчике afdpro
Подскажите как вернутся на шаг назад в отладчике afdpro. Все пишут, а этой информации я что то...

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

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

6
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
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
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
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
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
21.10.2018, 15:41 4
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
там тоже записано CE03:001F.
AFDPro может перехватывать это прерывание, поэтому и адрес подменяет.
Поэтому скачай отладчик AVPUtil: http://old-dos.ru/index.php?pa... ow&id=5580
В нём есть функция трассировки прерываний, которая вызывается по Ctrl+I
в списке выбираешь INT-8 и получаешь дизассемблерный код, который можешь трассировать по F1/F2
Миниатюры
[AFDPRO] Найти INT 8 и объяснить, как он работает  
1
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
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
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
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, но обработчик видимо правильный, т.к. показывает то, что надо.
Миниатюры
[AFDPRO] Найти INT 8 и объяснить, как он работает  
2
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2018, 05:21
Помогаю со студенческими работами здесь

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

Объяснить как работает часть кода
Нужна помощь, объяснить как работает часть кода, а именно добавление элементов в двусвязный...

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru