Как программно определить разрядность процессора?

Тема в разделе "WASM.ASSEMBLER", создана пользователем blackheretic, 17 янв 2006.

  1. blackheretic

    blackheretic New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2006
    Сообщения:
    4
    Привет всем!

    Необходимо программно определить разрядность процессора.

    Кто нить знает как?

    Пусть даже просто куда нить зайти и глазами посмотреть :)
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Просто:

    mov eax,xxxxxxxxh

    jmp short _16bit

    _32bit:

    ...

    _16bit:

    ...

    (переводишь в машинный код первую инструкцию если ты в 32 бита, то вторая инструкция поглащается первой, иначе переход на _16bit)
     
  3. blackheretic

    blackheretic New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2006
    Сообщения:
    4
    То есть получается что 32 битные приложения не будут бегать на 64 битном процессоре???
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    PROFi

    это не разрадность процессора а разрядность текущего сегмента определится (если определится...)
     
  5. blackheretic

    blackheretic New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2006
    Сообщения:
    4
    infern0

    А у тебя есть идеи?
     
  6. Alexey2005

    Alexey2005 New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2006
    Сообщения:
    19
    Адрес:
    Russia
    Определение разрядности процессора довольно проблематично.

    Прежде всего, проверим, не 16-разрядный ли проц нам попался:
    Код (Text):
    1. ;пока используется 16-битный код. Мы, само собой,
    2. ;в реальном режиме (или в V8086).
    3. pushf
    4. pop   ax
    5. test  ax,8000h
    6. jnz   l_ItIs8086Processor
    7. or    ax,0F000h
    8. push  ax
    9. popf
    10. pushf
    11. pop   ax
    12. test  ax,0F000h
    13. jnz   l_ItIs32Or64Processor
    14. l_ItIs16BitProcessor:
    15. ...
    16. l_ItIs8086Processor:
    17.  


    Здесь используется модификация регистра флагов и его анализ:

    1. У 8086/8088-процессоров бит 15 регистра flags всегда установлен. У более "старших" процессоров он всегда сброшен. Поэтому если pushf/pop ax даёт в регистре ax установленный 15-й бит, это 16-битный процессор.

    2. У 32-разрядных процессоров при попытке установить биты 12-15 (например, по popf) бит 15 не установится, бит 14 установится, а биты 12,13 установятся только при CPL=0 (в противном случае их не удастся изменить). Поэтому, сделав popf/pushf и проанализировав полученное значение, можно определить разрядность процессора. Точнее, возможность выполнения на нём 32-битного кода.

    Однако сейчас уже есть 64-битные процессоры, которые тоже могут выполнять 32-битный код. Отличить 32 и 64-разрядные процессоры можно с помощью CPUID.
    Код (Text):
    1.  
    2. xor  eax,eax
    3. inc  eax
    4. cpuid
    5. ;Теперь смотрим, есть ли нужное расширение
    6. test edx,40000000h
    7. jnz  l_ItIsIntel64BitProcessor ;64-бит. процессор от Intel
    8. ;Смотрим далее
    9. mov  eax,80000000h
    10. cpuid             ;проверка на AMD-процессор
    11. cmp  eax,80000000h
    12. jbe  l_ItIs32BitProcessor
    13. mov  eax,80000001h ;получим расширения AMD
    14. cpuid
    15. test edx,20000000h
    16. jnz  l_ItIsAMD64BitProcessor ;64-битный процессор от AMD.
    17. ;Иначе - 32-битный:
    18. l_ItIs32BitProcesor:
    19. ...
    20. l_ItIsIntel64BitProcessor:
    21. ...
    22. l_ItIsAMD64BitProcessor:
    23. ...


    Только предварительно нужно определить наличие CPUID (если можно программно модифицировать бит 21 регистра eflags, то CPUID поддерживается. Если нет, то это НЕ 64-битный процессор).
     
  7. blackheretic

    blackheretic New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2006
    Сообщения:
    4
    Alexey2005

    Спасибо большое!
     
  8. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Alexey2005

    верно для x86 архитектуры, но неверно для "процессора" в общем, как, собственно говоря, и был задан вопрос... :)
     
  9. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    infern0

    Погонять тесты работы с тем же АЛУ и с памятью (при отключенном кэшировании), при операциях над данными размером с "разрядность" процессор по идее покажет максимальную производительность.
     
  10. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Nothing

    это ты автору топика говори, я тут только как возмутитель спокойствия...
     
  11. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    на мой взгляд это разновидность задачи определения

    процессора , только более простая



    можно предложить такой алгоритм

    try {

    asm ia8instr;

    asm ia16instr;

    asm ia32instr;

    asm ia64instr;

    }

    catch (...)

    {

    опеределим где произошло исключение;

    }

    н
     
  12. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    Посмотри EXAMPLE из TASM 5.0,называется CPUID.А если запустить MOV EAX,0 на 16-bit, то получишь в ответ INVALID OPERATION CODE или хуже. Тоже и некоторых других случаях.