Уважаемые знатоки, подскажите пожалуйста, в чем ошибка: Есть у меня две функции для чтения и записи секторов диска (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);
// На экране нули...