OSDev

для всех
Текущее время: 08 дек 2019, 11:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: проблемы чтения с hdd
СообщениеДобавлено: 11 окт 2011, 04:46 

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблемы чтения с hdd
СообщениеДобавлено: 11 окт 2011, 09:44 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
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));

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблемы чтения с hdd
СообщениеДобавлено: 13 окт 2011, 05:06 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
мм!.. спасибо за подсказки. читать доки полностью нет времени.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблемы чтения с hdd
СообщениеДобавлено: 13 окт 2011, 11:04 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
qeos писал(а):
спасибо за подсказки. читать доки полностью нет времени.)

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB