прерывание int 13h не отрабатывает - переходит по неправильному адресу

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
isams
Сообщения: 5
Зарегистрирован: 02 ноя 2013, 13:16

прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение isams » 02 ноя 2013, 13:25

Добрый день уважаемые форумчане. Попытаюсь объяснить суть проблемы:
Задача: нужно записать данные на диск.
Использую прерывание 13h и функцию 03h и никаких проблем нет когда вызываю его из реального режима.

Проблема появляется при переходе из защищенного режима в реальный - устанавливаю сегментные регистры в 0, но вот после вызова прерывания переходит на выполнение команды jmp FAAE0. В этом месте при вызове без перехода из защищенного джампает по адресу AAE0, а вот при переходе прыгает по адресу 1AAE0. непонятно почему так происходит. Код привожу:

pusha
mov eax, cr0
and al, 0FEh
call $+5
pop ecx
add ecx, 0Bh
push 0
push ecx
mov cr0, eax
retf
mov ax, 700h
mov es, ax
mov ax, 0301h
mov cx, 12
mov dx, 0080h
mov bx, 0С00h
sti
int 13h; вот тут проблема при переходе из защищенного в реальный режим.

Подскажите пожалуйста в чем может быть проблема. Я с ассемблером недавно начал знакомиться, скажите хотя бы куда копать.

Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 16:14
Откуда: 71 RUS
Контактная информация:

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение somewhere » 03 ноя 2013, 18:02

Содержимое сегментных регистров перед вызовом Int 13 приведите
It's a long way to the top if you wanna rock'n'roll

isams
Сообщения: 5
Зарегистрирован: 02 ноя 2013, 13:16

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение isams » 03 ноя 2013, 19:14

Сегментные регистры равны 0000, кроме ES - он равен 700 т.к. буфер задается для int 13.

isams
Сообщения: 5
Зарегистрирован: 02 ноя 2013, 13:16

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение isams » 03 ноя 2013, 19:19

Еще читал про таблицу векторов прерывания, может ли быть ситуация, что адрес обработчика был изменен для прерывания int 13? Если да, то как это можно проверить?

isams
Сообщения: 5
Зарегистрирован: 02 ноя 2013, 13:16

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение isams » 03 ноя 2013, 19:27

isams писал(а):Сегментные регистры равны 0000, кроме ES - он равен 700 т.к. буфер задается для int 13.

Ну вернее я их сам зануляю:
xor eax,eax
mov ds,ax
... и т.д. со всеми регистрами.

Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 16:14
Откуда: 71 RUS
Контактная информация:

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение somewhere » 03 ноя 2013, 19:33

IDTR и IDT как выглядят? как инициализировали?
It's a long way to the top if you wanna rock'n'roll

isams
Сообщения: 5
Зарегистрирован: 02 ноя 2013, 13:16

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение isams » 03 ноя 2013, 19:37

somewhere писал(а):IDTR и IDT как выглядят? как инициализировали?

Вот про это я и хотел просить: как мне это можно проверить?

Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 16:14
Откуда: 71 RUS
Контактная информация:

Re: прерывание int 13h не отрабатывает - переходит по неправильному адресу

Сообщение somewhere » 03 ноя 2013, 19:40

что значит "проверить"? Программу кто писал?
It's a long way to the top if you wanna rock'n'roll

Ответить