Форум программистов, компьютерный форум, киберфорум
Jin X
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Рейтинг: 5.00. Голосов: 2.

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

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

Простое, но недокументированное определение производителя процессора (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
.another:
(я записал цифрами, т.к. компиляторы по-разному трактуют строки: в fasm и NASM можно записать 'ntel' для Intel, а вот в MASM придётся набирать задом наперёд 'letn').

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

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

Посему при необходимости (для обфускации или при сильно ограниченных ресурсах) можно сократить код до следующих строк:
Assembler
1
2
3
4
  xor edx,edx  ; ZF = 1
  div esp  ; esp is always > 0
  jz .Intel  ; on any div/idiv operation ZF flag will not be changed on Intel but will be cleared on AMD
.AMD:
Вложения
Тип файла: zip CPUVendorTest.zip (2.3 Кб, 64 просмотров)
Всего комментариев 5
Комментарии
  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
  3. Старый комментарий
    Аватар для Jin X
    Исправлена опечатка (но код верен). AMD выставляет флаг ZF в 0, а не в 1
    Собственно, эту опечатку я изначально перенёс сюда из книги Криса Касперски, хотя код там был верным.
    Запись от Jin X размещена 21.02.2022 в 21:34 Jin X вне форума
    Обновил(-а) Jin X 21.02.2022 в 21:47
  4. Старый комментарий
    Хм, разве после выполнения команды
    Assembler
    1
    
    xor edx,edx
    флаг нулевого результата ZF будет сброшен, а не установлен?
    Запись от sharpey размещена 23.02.2022 в 04:29 sharpey на форуме
  5. Старый комментарий
    Аватар для Jin X
    sharpey:
    Цитата:
    флаг нулевого результата ZF будет сброшен, а не установлен?
    Точно, поправил (в т.ч. в архиве)
    Запись от Jin X размещена 20.09.2023 в 13:17 Jin X вне форума
    Обновил(-а) Jin X 20.09.2023 в 13:20
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru