Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Использование rdtsc в DOS???


Автор: kostyantmb 19.9.2005, 16:21
Можно ли в Borland C++ 3.11 for DOS использовать rdtsc для последующего определения с помощью неё тактовой частоты процессора???
Если можно, то как?

Автор: _hunter 19.9.2005, 16:55
можно.
точно так же как и под окнами...
xor eax, eax
CPUID
RDTSC
mov [clock], EAX
...
xor eax, eax
CPUID
RDTSC
SUB eax, [clock]

Автор: SergeCpp 19.9.2005, 17:11
В окне Win9x — вылетать будет...

Я так пробовал.

Автор: _hunter 19.9.2005, 18:13
видать не так пробовал -- ничего не вылетало...

Автор: SergeCpp 20.9.2005, 06:34
Имеется в виду программа DOS (Multi-Edit)

Если туда ставишь RDTSC, то в окне Win9x - недопустимая команда

Win9x — не NT-based system

Конкретно — Millennium

Что там не так можно сделать — два байта команда (и всё)

Автор: _hunter 20.9.2005, 10:47
что за "программа DOS (Multi-Edit)"?

насчет линолеума -- не знаю, но в универе под 98-й без проблем шло...
+ под 2000 (и ХР), который гораздо строже относятся к подобным коммандам тоже все без проблем работает...

Автор: SergeCpp 20.9.2005, 12:15
Multi-Edit for DOS Version 7.00 Professional

released 1993

Автор: _hunter 20.9.2005, 13:02
и о чем это говорит? -- Multi-Edit ( for DOS )-- жуткое крывулище...

Автор: Crait 20.9.2005, 14:47
MultiEdit 7 - штука кульная, не нада ляля smile
Вот тока куда в него и как "поставили" инструкцию RDTSC ?? smile

Автор: SergeCpp 20.9.2005, 15:09
Код


void _speed() trans
{
  // save int 17 - BIOS: Parallel Printer

  r_ax = 0x3517;

  intr ( 0x21 );

  int int17seg = r_es;
  int int17ofs = r_bx;

  // save int 18 - BIOS: ROM BASIC Loader

  r_ax = 0x3518;

  intr ( 0x21 );

  int int18seg = r_es;
  int int18ofs = r_bx;

  // set int 17 to reset counter

  str reset[ 15 ] = "\x66\x33\xC0"             \ // xor   edx, edx
                    "\x66\x33\xD2"             \ // xor   eax, eax
                    "\x66\xB9\x10\x00\x00\x00" \ // mov   ecx, 0x10
                    "\x0F\x30"                 \ // wrmsr
                    "\xCF";                      // iret

  r_ax = 0x2517;
  r_ds = seg( reset );
  r_dx = ofs( reset ) + 4;

  intr ( 0x21 );

  // set int 18 to rdtsc

  str rdtsc[ 32 ] = "\x0F\x31"                 \ // rdtsc
                    "\x66\x8B\xD8"             \ // mov   ebx, eax
                    "\x66\xC1\xEB\x10"         \ // shr   ebx, 16
                    "\x66\x8B\xCA"             \ // mov   ecx, edx
                    "\x66\xC1\xEA\x10"         \ // shr   edx, 16
                    "\xCF";                      // iret

  r_ax = 0x2518;
  r_ds = seg( rdtsc );
  r_dx = ofs( rdtsc ) + 4;

  intr ( 0x21 );

  // init

  int hi32  = 0;
  int lo32  = 0;

  int min   = MAX_INT;

  int count = 1000;

  // work init

  int zz_i = 1;
  str zz_s = "";

  while( count-- )
  {
    // reset counter

    intr( 0x17 );

    // work

    zz_s = str( zz_i );

  //~zzz++; // 1770
  //zzz++;  //   60
  //delay( 100 ); // 16,653,405 - 166MHZ

    //rm( "_TEST^_XYZ" );
    //_xyz();
  //zz = xpos( 'x', ln, 1 ); // q - 720, x - 780
  //zz = pos ( 'x', ln    ); // q - 655, x - 667

  //indent_style--;    // 814
  //indent_style -= 1; // 814

    // read counter

    intr( 0x18 );

    hi32 = r_dx << 16 | r_cx;
    lo32 = r_bx << 16 | r_ax;

    if( lo32 < min )
    {
        min  = lo32;
    }

    // work

  //indent_style++;
  }

  // restore int 17

  r_ax = 0x2517;
  r_ds = int17seg;
  r_dx = int17ofs;

  intr ( 0x21 );

  // restore int 18

  r_ax = 0x2518;
  r_ds = int18seg;
  r_dx = int18ofs;

  intr ( 0x21 );

  // done

  make_message( _str( min - 361 ) ); // 336..361..410..439
}


Добавлено @ 15:11
WRMSR я комментировал, знаю, что за штука...

Автор: _hunter 20.9.2005, 15:12
э... и при чем тут этот код?

Автор: SergeCpp 20.9.2005, 15:15
Вот тока куда в него и как "поставили" инструкцию RDTSC ??


это ответ на вопрос выше

Автор: _hunter 20.9.2005, 15:36
ты, наверное, не заметил, но там кроме этой инструкции есть еще несколько. среди них -- вызов прерывания. если именно этот код ты и вставлял -- ничего удивительного в том, что окна его не пропускали.

Автор: SergeCpp 20.9.2005, 16:50
Без этой инструкции (если NOP NOP) — всё работало!

Это же мой код — с "нуля".
Добавлено @ 16:51
Да и ругались именно на RDTSC (PC там был — на ней)

Автор: kostyantmb 21.9.2005, 06:25
Дак как это всё-таки на С реализовать???

Там все не так как под окнами, пробовал!

Автор: SergeCpp 21.9.2005, 06:43
функция-вставка на асме

типа

#pragma warning( disable : 4035 ) // no return value

__forceinline DWORD rdtsc()
{
__asm rdtsc // edx:eax
}

#pragma warning( default : 4035 )

DWORD мне хватает...

Если надо hi-dword, думай сам...

это, конечно, VC6, но делай аналогично...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)