проверка поддержки инструкции CPUID

Тема в разделе "WASM.OS.DEVEL", создана пользователем abcd008, 9 фев 2011.

  1. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я написал процедуру для проверки, если есть время проверьте, правильно ли она работает.
    только внимательнее.

    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 поддерживается
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Непосредственно проверку на CPUID сделать элементарно - проверить изменяемость бита ID в регистре EFLAGS. 32-разрядные процессоры - изменяемость битов IOPL и NT. Ты сомневаешься в правильности реализации подобных проверок? )))
     
  3. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я не сомневаюсь в проверках.
    первая проверка здесь проверяет наличие 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
    там первый пример.
     
  4. Andrzej

    Andrzej New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2008
    Сообщения:
    11
    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. В примере проверяется только одно условие. Непонятно. Возможно, проще словить исключение?
     
  5. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    команда xor меняет значение бита на противоположное. а не устанавливает или обнуляет. так что она сразу проверяет возможность изменить бит на противоположный в данном случае флаг ID
     
  6. Andrzej

    Andrzej New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2008
    Сообщения:
    11
    Без контекста определение не верно.
    Это как?
    В мане про инверсию бита не написано:
    То бишь необходимо два раза использовать popfd (инвертировать бит и восстановить старое значение).
     
  7. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    в комментариях все написано) и у меня тоже только на русском