OSDev
http://osdev.ru/

проблемы чтения с hdd
http://osdev.ru/viewtopic.php?f=6&t=448
Страница 2 из 2

Автор:  qeos [ 11 окт 2011, 04:46 ]
Заголовок сообщения:  Re: проблемы чтения с hdd

Himik писал(а):
Похоже, вся соль во флаге направления, который ты в этом месте обнуляешь, хотя он должен быть обнулён ещё до вызова данной функции. Компилятор тут не причём, т.к. он считает, что флаг всегда сброшен. Наверно, ты не обнуляешь его на входе в обработчик прерывания от винчестера, а надо бы.

Всмысле? я его сбрасываю прям перед повтором инструкции insw.. так и надо вроде.. у меня работает как раз с ассемблерной вставкой, а с простым чтением в цикле не работало.
Himik писал(а):
Кстати, в asm вставке ты предаёшь buf без индекса сектора i, что странно.

Код:
        asm("cld \r\n\
            rep insw"::"c"(256),"d"(dev->base+REG_DATA),"D"(buff));
        buff+=256;

Автор:  Himik [ 11 окт 2011, 09:44 ]
Заголовок сообщения:  Re: проблемы чтения с hdd

qeos писал(а):
Всмысле?

Обнуление флага перед каждой командой не делают, потому что считается, что по-умолчанию он сброшен. Просто держи его в сброшенном состоянии в самом начале работы системы и на входе в обработчики прерываний, иначе Сишный код (особенно строковые функции) будет глючить (хотя в твоём примере видимо другая проблема).
qeos писал(а):
Код:
        asm("cld \r\n\
            rep insw"::"c"(256),"d"(dev->base+REG_DATA),"D"(buff));
        buff+=256;

Интересно бы ещё смоделировать весь цикл на Ассемблере с побайтным (пословным) чтением, как было в Сишном алгоритме, чтобы проверить - он работоспособный или нет в принципе.

PS. Кстати, в этом коде можно убрать "buff+=256", т.к. команда insw и так смещает указатели. Можно просто написать
Код:
        asm("cld \r\n\
            rep insw"::"c"(256),"d"(dev->base+REG_DATA),"+D"(buff));

Здесь + означает изменение параметра.

Автор:  qeos [ 13 окт 2011, 05:06 ]
Заголовок сообщения:  Re: проблемы чтения с hdd

мм!.. спасибо за подсказки. читать доки полностью нет времени.)

Автор:  Himik [ 13 окт 2011, 11:04 ]
Заголовок сообщения:  Re: проблемы чтения с hdd

qeos писал(а):
спасибо за подсказки. читать доки полностью нет времени.)

Ага. Кстати, забыл сказать про одну важную вещь. В параметрах ассемблерной вставки надо указывать все изменяемые регистры, иначе может произойти конфликт с сишным кодом и возникнуть ошибки в работе. Там я указал изменение только одного параметра, а надо ещё указать и ecx.
Если регистр соответствует какому-нибудь входному или выходному параметру, то отмечаем "+" или "=" соответствено. Если изменяемый регистр ни в каких параметрах не используется, то он прописывается в третьем ряду.
Иногда к слову asm нужно добавлять volatile или указать изменение памяти "memory", (что называется "побочный эффект"), иначе этот код может быть оптимизатором съеден как не производящий ни какого полезного действия. Типа того:
Код:
    asm volatile("rep insw"
    : "+D"(buff), "+c"(256)
    : "d"(dev->base+REG_DATA)
    : "memory");

Изменяемые параметры указываются в первом ряду, неизменяемые параметры во втором, а изменяемые регистры в третьем.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/