Процессоры Intel 80x86 и AMD 80x86 "в основном одинаковы", но некоторые вещи совершенно разные (например, расширения виртуальных машин - SVM против VT-x), а некоторые вещи (расширения) могут или не могут поддерживаться. Однако некоторые вещи на разных процессорах одного и того же производителя отличаются (например, некоторые чипы Intel поддерживают AVX2, а некоторые нет).
Есть несколько способов справиться с различиями:
используется только общее подмножество, поэтому один и тот же код выполняется на всех процессорах 80x86 (например, обрабатывает его как чип 8086).
использует подмножество функций, общих для ряда процессоров, поэтому один и тот же код выполняется на всех процессорах 80x86 в этом диапазоне. Это очень часто (например, «это программное обеспечение требует 80x86 CPU (и ОС), который поддерживает 64-битные расширения»).
использовать тесты во время установки. Например, может существовать 4 разные копии программного обеспечения (скомпилированные для 4 разных диапазонов процессоров), где установщик решает, какая копия имеет смысл для компьютера, на котором устанавливается программное обеспечение.
использовать тесты во время выполнения. Например, код может использовать инструкцию CPUID
для выполнения if( AVX2_is_supported() ) { set_function_pointers_so_AVX2_is_used(); } else {set_function_pointers_so_AVX2_is_not_used(); }
. Примечание. Некоторые компиляторы (ICC Intel) могут автоматически генерировать код, выполняющий тесты во время выполнения.
Это не взаимоисключающие опции. Например, установщик может решить установить 64-разрядную версию (а не 32-разрядную версию), а затем 64-разрядная версия может проверить, какие функции поддерживаются во время выполнения и имеют другой код для использования различных функций.
Также обратите внимание, что различные части ОС могут обрабатываться отдельно. Например, ОС может иметь 6 разных загрузчиков, 4 разных «HAL», 4 разных ядра и 3 разных «модуля ядра» для поддержки виртуализации; где некоторые из этих вещей могут выполнять тесты во время выполнения, а некоторые нет.
У процессоров Intel и AMD один и тот же ассемблер?
Почти все ассемблеры для 80x86 поддерживают практически все расширения (от всех производителей процессоров - например, Intel, AMD, VIA, Cyrix, SiS, ...). В общем; программист (или компилятор) должен убедиться, что они используют только те вещи, которые, как они знают, существуют. Некоторые ассемблеры предоставляют функции, облегчающие эту задачу (например, NASM предоставляет директиву CPU ...
, чтобы программист мог указать ассемблеру генерировать ошибки, если он видит инструкции, которые не поддерживаются в указанном ЦП).