Форум программистов, компьютерный форум, киберфорум
Наши страницы
Jin X
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Простое, но недокументированное определение производителя процессора (Intel / AMD)

Запись от Jin X размещена 14.10.2018 в 20:58
Обновил(-а) Jin X 15.10.2018 в 13:33

Простое, но недокументированное определение производителя процессора (Intel / AMD)


Обычно для определения производителя процессора используется инструкция cpuid (функция eax=0):
Assembler
1
2
3
4
5
6
7
  xor eax,eax
  cpuid  ; get vendor id string in ebx:edx:ecx
  cmp ecx,6C65746Eh  ; 'ntel' (full string is 'GenuineIntel')
  je .Intel
  cmp ecx,444D4163h  ; 'cAMD' (full string is 'AuthenticAMD')
  je .AMD
.other:
(я записал цифрами, т.к. компиляторы по-разному трактуют строки: в fasm и NASM можно записать 'ntel' для Intel, а вот в MASM придётся набирать задом наперёд 'letn').

Но есть один недокументированный способ, который описан в приложенных файлах к книге Криса Касперски "Техника отладки программ без исходных текстов" (немного в другом виде и коде, нежели у меня, но суть та же).

Смысл в том, что несмотря на то, что в мануалах Intel и AMD написано, что инструкция dividiv) возвращает флаг ZF неопределённым, тем не менее, Intel его не меняет, а AMD всегда выставляет в 1 (вне зависимости от результата, тестовые программы можно посмотреть здесь).

Посему при необходимости (для обфускации или при сильно ограниченных ресурсах) можно сократить код до следующих строк:
Assembler
1
2
3
4
  xor edx,edx  ; ZF = 0
  div esp  ; esp is always > 0
  jz .Intel  ; on any div/idiv operation ZF flag will not be changed on Intel but will be set on AMD
.AMD:
Вложения
Тип файла: zip CPUVendorTest.zip (2.2 Кб, 52 просмотров)
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Usaga
    Занятно, конечно, но вряд ли такой подход имеет практическую ценность. Такое поведение в будущем может измениться, а значит подход ненадёжен.

    Да и какие такие ресурсы данный подход экономит?
    Запись от Usaga размещена 15.10.2018 в 08:06 Usaga вне форума
  2. Старый комментарий
    Аватар для Jin X
    Цитата:
    вряд ли такой подход имеет практическую ценность
    Обычно недокументированные фичи производители не трогают (хотя, данная штука не так широко используется, поэтому вероятность "нарваться на неприятности", возможно, чуть выше). И конечно, такие вещи часто используют тогда, когда другими способами добиться результата нельзя или проблематично. В данном же случае, учитывая существование более надёжного (и тоже простого) метода, этот способ действительно менее предпочтителен в общем случае и больше подходит ради забавы или для общего развития.

    Цитата:
    Да и какие такие ресурсы данный подход экономит?
    Несколько областей применения придумать можно, хоть они и весьма специфичны, к примеру:
    – при обфускации кода (вариант с cpuid гораздо более очевиден),
    – при запуске на очень старых процессорах, у которых нет cpuid (386 и младше, некоторые 486), хотя это стоит всё же предварительно проверить (если у кого-то есть возможность, сделайте, плиз ),
    – в коде, где на счету каждый байт (к примеру, в демосцене),
    – вряд ли проверка процессора будет использоваться в критических к скорости циклах, но просто как факт: div работает гораздо быстрее, чем cpuid и не выполняет сериализацию.

    Собственно, эту статью я написал ради того, чтобы поделиться забавным фактом.
    А нужно это вам или нет (и для чего) – решайте сами
    Запись от Jin X размещена 15.10.2018 в 09:04 Jin X вне форума
    Обновил(-а) Jin X 15.10.2018 в 10:02
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.