LINUX.ORG.RU

Ассемблерные вставки


0

1

Уважаемые знатоки, подскажите пожалуйста, в чем ошибка: Есть у меня две функции для чтения и записи секторов диска (IDE)

void ide_read_rep( IDE_Dev *dev, ui16 reg, ui16 count, ui16 *buf ) {
    // portio_inw_rep( ide_get_port( dev, reg ), count, buf );
    for(ui32 i = 0; i < count; ++i) {
        buf[i] = portio_inw(ide_get_port( dev, reg ));
    }
}

// Функция записи в порт с повторами
void ide_write_rep( IDE_Dev *dev, ui16 reg, ui16 count, ui16 *buf ) {
    // portio_outw_rep( ide_get_port( dev, reg ), count, buf );
    for(ui32 i = 0; i < count; ++i) {
        portio_outw(ide_get_port( dev, reg ), buf[i]);
    }
}
и есть функции работы с портами
// Чтение слова из порта
ui16 portio_inw( ui16 port ) {
    ui16 ret = 0;

    __asm __volatile__ ( "inw %%dx, %%ax\n\t" : "=a" ( ret ) : "d" ( port ) );

    return ret;
}

// Запись слова в порт
void portio_outw( ui16 port, ui16 value ) {
    __asm __volatile__( "outw %%ax, %%dx\n\t" : : "a"( value ), "d" ( port ) );
}

// Чтение слова из порта с повторами
void portio_inw_rep( ui16 port, ui32 count, ui16 *buf ) {
    __asm __volatile__ ( "rep insw\n\t" : "=D" ( buf ) : "d" ( port ), "c" (count) );
}

// Запись слова в порт с повторами
void portio_outw_rep( ui16 port, ui32 count, ui16 *buf ) {
    __asm __volatile__( " rep outsw\n\t" : : "S"( buf ), "d" ( port ), "c" (count) );
}

Так вот, если в функциях чтения и записи воспользоваться функциями чтения с повторениями (portio_inw_rep, portio_outw_rep - эти функции закомментированы) вместо циклов for, то передаваемые буферы не заполняются (в случае чтения) / не записываются (в случае записи)... Никак не могу понять в чем дело, подскажите, если кто знает почему... Заранее спасибо

З.Ы. Видимо с ассемблером в С у меня не очень, та же ситуация с чтением msr регистра

ui32    msr_high;
ui32    msr_low;
ui32    msr_offset = 0x0480;

//__asm volatile ( "rdmsr\n\t"
//                 : "=d" (msr_high), "=a" (msr_low)
//                 : "c" (msr_offset) );
__asm volatile ( "rdmsr\n\t"
                 "movl %%edx, %0\n\t"
                 "movl %%eax, %1\n\t"
                 : "=m" (msr_high), "=m" (msr_low)
                 : "c" (msr_offset) );

    printf("%x\n", msr_high);
    printf("%x\n", msr_low);

// На экране нули...

Мальчик, осиль клоббер лист, тогда и приходи.

anonymous ()

Мальчик, осиль флаг направления для rep, тогда и приходи.

anonymous ()

Ох уж эти юные осеписатели...

anonymous ()
Ответ на: комментарий от anonymous

Господа «великие знатоки», вы бы хотя бы не позорились...memory, сс им подавай... А если бы внимательно посмотрели, нашли бы проблему...У меня глаз замылился, я вчера вечером еще раз взглянул на код и сразу же нашел ошибку...А вам бы только потрещать...

З.Ы. Для тех, кому когда-нибудь понадобится решение данной проблемы:

// Чтение слова из порта с повторами
void portio_inw_rep( ui16 port, ui32 count, ui16 *buf ) {
    __asm __volatile__ ( "rep insw\n\t" :: "D" ( buf ), "d" ( port ), "c" (count) );
}
energyclab ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.