13. ПРЕФИКСЫ
============
Инструкция с одним или более префиксами не сможет выполниться в V-трубе
(смотри раздел 8.7), кроме того требуется один такт, для декодирования
каждого префикса, за исключением 0Fh на Pentium MMX и Pentium Pro.
Префиксы адреса, могут быть анулированны использованием 32 битного режима.
Сегментные префиксы могут быть анулированны в 32 битном режиме, использованием
модели памяти FLAT.
Префиксы размера операнда могут быть анулированны в 32 битном режиме, если вы
будете пользоваться только 8 или 32 битными числами.
Там, где без префиксов не обойтись, их декодирование может быть замаскированно
если предыдущая инструкция исполнялась более одного такта. Для Pentium без MMX
существует правило - любая инструкция, исполняющаяся N тактов (не
декодирующаяся) может "затмевать" N-1 префикс для следующих двух (иногда трех)
инструкций. Другими словами, каждый такт (кроме первого), который использует
инструкция, что бы выполниться может быть использован для декодирования
префикса последующей инструкции. Этот эффект может распространяться на
предсказанную ветвь. Любая инструкция, которая использует дополнительные такты
из-за остановки AGI, промаха кеша, рассогласования, или любой друго причины,
кроме задержки декодирования и не правильного предсказания перехода может
"затмевать" декодировку префиксов последующих команд. На Pentium MMX
неспаренные команды так же могут создавать эффект "затемнения".
Примеры:
CLD / REP MOVSD
Инструкция CLD исполняется два такта, по этому второй такт будет использован
для того, что бы "затемнить" декодирование префикса REP. Код использует
два такта, если CLD будет стоять "далеко" от REP MOVSD.
CMP DWORD PTR [EBX],0 / MOV EAX,0 / SETNZ AL
Инструкция CMP, так же, будет исполняться два такта, потому что это инструкция
чтения/модифицирования. Префикс 0Fh инструкции SETNZ будет декодирован во
время второго такта инструкции CMP, таким образом процесс декодирования будет
скрыт.
Дальше
|