MMX-команды исполняются в том же режиме процессора, что и команды
с плавающей запятой. Поэтому при исполнении всех MMX-команд
(кроме EMMS) "портится" слово состояния регистров с плавающей запятой.
Команда EMMS обеспечивает переход процессора от исполнения MMX-команд к
исполнению обычных команд с плавающей запятой: она устанавливает
значение 1 во всех разрядах слова состояния.
Заканчивайте командой EMMS любой фрагмент программы, в котором есть
MMX-команды. Если этого не делать, то
- операции с плавающей запятой будут давать неверные результаты;
- иногда в результате операций с плавающей запятой будут генерироваться
исключения типа Stack overflow.
Справа вверху Вы видите фрагмент программы, в котором непосредственно
за командой movq следует вызов процедуры, использующей
операции с плавающей запятой. В результате возникает
исключение Stack overflow.
Внизу показан тот же фрагмент программы, в который вставлена команда
EMMS. Здесь переполнения стека не возникает.