Qraizer
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Если 21-й бит (не помню точно номер, но вроде он) регистра FLAGS модифицируется, то поддерживается инструкция CPUID. Код: pushfd pop eax mov edx, eax btc eax, 21 push eax popfd pushfd pop eax xor eax, edx bt eax, 21 jne CPUIDsupported | Если инструкция поддерживается, то выполняя её с параметром 0, получаешь максимальный номер параметра. Поддержка параметра 0 гарантируется. Тебе нужен параметр 1. Код: xor eax, eax cpuid cmp eax, 1 jae param1supported | Выполняешь её с параметром 1 и получаешь флаги возможностей в EDX, в котором 4-й бит указывает на поддержку регистра TSC и соответственно команды RDTSC Код: mov eax, 1 cpuid bt edx, 4 jc TSCsupported | Если поддерживается, то бит 2 в регистре CR4 указывает на возможность использования инструкции RDTSC в непривилегированном режиме. Код: mov eax, cr4 bt eax, 2 jNc RDTSCuserModeAllowed | Чтение регистра CR4 есть привелегированная инструкция, но некоторые ОС позволяют её читать, эмулируя её на уровне ядра. К сожалению, WinNT и иже с ней к таковым не относятся. Но зато они очищают этот бит, так что исполнять RDTSC можно. Впрочем, можно так сделать: Код: __try { __asm rdtsc; supported = true; } __except(EXCEPTION_EXECUTE_HANDLER) { supported = false; } if(!supported) /* Ой */ | Доступно объяснил? Мож чё замутно покажется... | Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 17:20 21-10-2006 | Исправлено: Qraizer, 17:40 21-10-2006 |
|