Удивительная команда RDTSC. Команда RDTSC - Read from Time Stamp Counter. $0F $31 - EDX:EAX <-- TimeStampCounter. Начиная с пятого поколения процессоры Intel содержат 64-разрядный счётчик времени(Time Stamp Counter), принадлежащий множеству MSR-регистров, который увеличивается на единицу на каждом такте(хотя это и не гарантируется Intel, гарантируется лишь монотонное возрастание счётчика). Если CPL(текущий уровень привилегий) = 0, то состояние бита регистра CR4.TSD не влияет на выполнение команды. Если CPL > 0, то значение TimeStampCounter можно прочитать лишь при CR4.TSD = 0. Модифицировать счётчик можно только при CPL = 0. Влияние на флажки: нет. Особые случаи R-режима: нет. Особые случаи P-режима: #GP(0), если CR4.TSD = 1 и CPL <> 0. Особые случаи V-режима: #GP(0), при попытке выполнить команду. =============================================================== ВОПРОС! Я обнаружил, что команда RDTSC ВЫПОЛНЯЕТСЯ(?!) в V-режиме(DOS-программы, которые используют эту команду, запускались в Windows 2000 на P4 1800 и в WindowsXP на Tualatin'е). В Windows 95 на P54C в V-режиме команда RDTSC НЕ РАБОТАЕТ, как ей и положено. Как такое возможно? Кто-нибудь может дать ответ.
Спасибо за информацию(про отсутствие V-режима в NT я ничего не знал). Не подскажете, где можно получить дополнительную информацию(я новичок в программировании под WIN32). Заранее спасибо. P.S. Наверное лучше отдельным сообщением... Но всё же как программа может определить режим в котором она выполняется, конкретнее как отличить V-режим от P-режима? Я знаю про PUSHF и SMSW, но они не помогают.
Может поможет Зубков? ; Проверить, не находимся ли мы уже в PM. mov eax, cr0 test al, 1 jz no_V86 ; Сообщить и выйти ... ;Может быть, это Windows 95 делает вид, что PE = 0? no_V86: mov ax, 1600h int 2Fh test al, al jz no_windows ; Сообщить и выйти ... ; Итак, мы точно находимся в реальном режиме. no_windows: ...
Я извиняюсь, но выполнение (MOV EAX, CR0) в V-режиме приведёт к GP(0). Программа умрёт ничего не поняв. Вместо (MOV EAX, CR0) как раз и можно использовать (SMSW AX), эта команда выполняется всегда и везде. После её выполнения младший бит AX как раз и покажет в реальном(0) или защищённом(1) режиме выполнилась команда. Нельзя ли отличить V-режим от P-режима, не обращаясь к операционной системе?