Следующие команды не попадают ни в одну из вышеприведенных категорий, но тем не менее не теряют своей значимости.
Команды BSWAP, XADD и CMPXCHG отсутствуют на микропроцессорах 386 DX или 386 SX. ЦПУ 386 может выполнять аналогичные операции в командах умножения. Для того, чтобы использовать эти команды, всегда включайте функционально эквивалентный код для ЦПУ 386. Используйте код, приведенный на Рисунок 3-23 для определения, могут ли данные команды быть использованы.
+----------------------------------------------------------------+| $title ("Определяет идентификатор ЦПУ для ЦПУ 386 или i486") || || name CPU_ID || public is386 || || code segment er public use32 || ; || ; Идентифицирует текущий тип ЦПУ, на котором выполняется работа|| ; Возвращает значения EAX=0 для ЦПУ i486, или EAX=1 для ЦПУ 386|| ; Оставляет неизмененными ESP, EBP, EBH, ESI и EDI || is386 proc near || mov edx,esp ; сохраняет значение текущего || ; указателя стека для || ; выравнивания его || and esp,not 3 ; выравнивает стек для || ; избежания ошибки AC || pushfd ; сохраняет EFLAGS || pop eax ; получает из стека значение EAX || mov ecx, eax ; сохраняет исходное значение || ; EFLAGS || xor eax, 40000H ; перебрасывает на противоположное|| ; значение бита АС || push eax ; копирует в EFLAGS || popfd || pushfd ; получает новое значение EFLAGS || pop eax ; помещает в EAX || xor eax, ecx ; проверяет, если бит АС изменен, || ; ЕАХ=4000Н, если процессор 386, || ; 0, если процессор i486 || shr eax, 18 ; устанавливает ЕАХ=1, если ЦПУ || ; 386, 0, если ЦПУ i486 || and eax, 1 ; игнорирует все остальные биты || push ecx || popfd ; восстанавливает исходное || ; значение регистра EFLAGS || mov esp, edx ; восстанавливает исходное || ; значение указателя стека || ret || is386 endp || || code ends || end |+----------------------------------------------------------------+ Рисунок 3-23 Код для определения CPU_ID