7. БЛОКИРОВКА ГЕНЕРАЦИИ АДРЕСА (AGI).
========================================
Требуется один такт, что бы рассчитать адрес, требующийся инструкции для
доступа к памяти. Обычно это делается отдельно, в конвеере, пока выполнятеся
предыдущая инструкция или пара инструкций. Но если адрес зависит от
результата инструкции, выполняющейся в предыдущем такте, то потребуется еще
один такт, дополнительно, для расчета адреса. Это было названо остановка AGI.
Пример:
ADD EBX,4 / MOV EAX,[EBX] ; остановка AGI
В данном примере остановка AGI может быть легко удалена, путем добавления
других инструкций между ADD EBX,4 и MOV EAX,[EBX] или путем обмена их
местами:
MOV EAX,[EBX+4] / ADD EBX,4
Также может получиться остановка AGI при применении инструкций использующих
ESP для адресации, т.н. PUSH, POP, CALL и RET, если ESP была изменена в
предыдущем такте инструкцией типа MOV, ADD или SUB. Однако у Pentium есть
специальная схема, которая позволяет предсказать значение ESP после стековых
операций, таким образом вы не получите остановку AGI после использования PUSH,
POP и CALL. Однако вы можете получить остановку AGI после RET, если у него
есть операнд для добавления к ESP.
Примеры:
ADD ESP,4 / POP ESI ; остановка AGI
POP EAX / POP ESI ; нет остановки, спаривание
MOV ESP,EBP / RET ; остановка AGI
CALL L1 / L1: MOV EAX,[ESP+8] ; нет остановки
RET / POP EAX ; нет остановки
RET 8 / POP EAX ; остановка AGI
Инструкция LEA также приводит к остановке AGI, если она использует базовый или
индексный регистр, который был изменен в предыдущем такте.
INC ESI / LEA EAX,[EBX+4*ESI] ; остановка AGI
Дальше
|