Добрый день уважаемые форумчане. Попытаюсь объяснить суть проблемы:
Задача: нужно записать данные на диск.
Использую прерывание 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; вот тут проблема при переходе из защищенного в реальный режим.
Подскажите пожалуйста в чем может быть проблема. Я с ассемблером недавно начал знакомиться, скажите хотя бы куда копать.
прерывание int 13h не отрабатывает - переходит по неправильному адресу
Модератор: Andy
Содержимое сегментных регистров перед вызовом Int 13 приведите
It's a long way to the top if you wanna rock'n'roll
Сегментные регистры равны 0000, кроме ES - он равен 700 т.к. буфер задается для int 13.
Еще читал про таблицу векторов прерывания, может ли быть ситуация, что адрес обработчика был изменен для прерывания int 13? Если да, то как это можно проверить?
isams писал(а):Сегментные регистры равны 0000, кроме ES - он равен 700 т.к. буфер задается для int 13.
Ну вернее я их сам зануляю:
xor eax,eax
mov ds,ax
... и т.д. со всеми регистрами.
IDTR и IDT как выглядят? как инициализировали?
It's a long way to the top if you wanna rock'n'roll
somewhere писал(а):IDTR и IDT как выглядят? как инициализировали?
Вот про это я и хотел просить: как мне это можно проверить?
что значит "проверить"? Программу кто писал?
It's a long way to the top if you wanna rock'n'roll