"Оптимизация для PENTIUM процессора" - читать интересную книгу автораесли ваша программа будет запускаться на процессорах Pentium или более
современных. Я протестировал другие Intel процессоры и ни на каком не было никаких проблем при опускании WAIT на любых 32 битных, хотя Intel утверждает, что там WAIT необходим, за исключением FNSTSW и FNSTCW. Если вы хотите быть уверенным, что бы ваш код работал на любом 32 битном процессоре (в том числе и не Intel), то я рекомендую устанавливать WAIT, для безопасности. Относительно в: Ассемблер автоматически вставляет WAIT перед следующими инструкциями: FCLEX, FINIT, FSAVE, FSTCW, FSTENV, FSTSW Вы можете опускать WAIT используя FCLEX, мои тесты показывают, что использование WAIT не необходимо, поскольку здесь и без WAIT будет генерироваться прерывание, за исключением FNCLEX и FNINIT на 80387. (есть некоторая несовместимость инструкции IRET и последующих инструкций FN..). Почти все другие инструкции с генерируют прерывание, если предыдущая инструкция размаскировала бит прерывания, так что прерывание рано или поздно произойдет в любом случае. Вам потребуется WAIT, если вы хотите узнать, где точно произошло исключение. Рассмотрим например б.3: Если вы хотите получить возможность восстанавливаться из исключения генерируемого FLD, то вам потребуется WAIT, поскольку для ADD ESP,4 величина должна быть загружена. 17.11 FCOM + FSTSW AX Обычный путь сравнения чисел с плавающей точкой это: FLD [a] FCOMP [b] FSTSW AX SAHF JB ASmallerThanB Вы можете улучшить этот код, используя FNSTSW AX вместо FSTSW AX и тестируя AH непосредственно, вместо использования неспариваемой SAHF. (У TASM версии 3.0 есть баг инструкции FNSTSW AX) FLD [a] FCOMP [b] FNSTSW AX SHR AH,1 JC ASmallerThanB Тестируем на ноль или равенство: FTST FNSTSW AX AND AH,40H JNZ IsZero ; (флаг нуля(ZF) инвертирован!) |
|
|