я написал процедуру для проверки, если есть время проверьте, правильно ли она работает. только внимательнее. pushf ;сохраняем исходные флаги pushf ;... pop ax ; xor ah,11110000b ;меняем значения флагов 12-15 на противоположные push ax ; popf ;сохраняем изменения pushf ;и считываем для сравнения новое значение pop bx ; popf ;восстанавливаем флаги xor ah,bh ;проверяем новое состояние флагов jne endtest ; если равно (если 0) то 386. иначе на выход pushfd ;здесь все аналогично, только проверяется 21 бит pushfd pop eax xor eax,200000h push eax popfd pushfd pop ebx popfd xor eax,ebx jne endtest ; если не изменился то выход если тест прошел то cpuid поддерживается
Непосредственно проверку на CPUID сделать элементарно - проверить изменяемость бита ID в регистре EFLAGS. 32-разрядные процессоры - изменяемость битов IOPL и NT. Ты сомневаешься в правильности реализации подобных проверок? )))
я не сомневаюсь в проверках. первая проверка здесь проверяет наличие 32х разрядного процессора(386), а вторая (ID 21бит) уже наличие самой инструкции cpuid. проверить я просил полностью, вдруг где ошибся. например код из которого я это сделал. я взял на wiki. но там в комментарии почему-то результат при другом значении регистров. вот я и решил проверить, кто прав. но мне кажется что у них ошибка в описании и прав я. http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80_%D1%84%D0%BB%D0%B0%D0%B3%D0%BE%D0%B2 там первый пример.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Order Number: 253666-032US, September 2009; Vol. 2A 3-181, CPUID—CPU Identification: AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions, 24594—Rev. 3.14—September 2007; Instruction Reference 103, CPUID: Если следовать инструкциям, то необходимо проверить возможность и установки, и сброса флага ID. В примере проверяется только одно условие. Непонятно. Возможно, проще словить исключение?
команда xor меняет значение бита на противоположное. а не устанавливает или обнуляет. так что она сразу проверяет возможность изменить бит на противоположный в данном случае флаг ID
Без контекста определение не верно. Это как? В мане про инверсию бита не написано: То бишь необходимо два раза использовать popfd (инвертировать бит и восстановить старое значение).