Блокировка генерации адреса (AGI)

<!--StartFragment -->
Требуется один такт, что бы рассчитать адрес, требующийся инструкции для
доступа к памяти. Обычно это делается отдельно, в конвеере, пока выполнятеся
предыдущая инструкция или пара инструкций. Но если адрес зависит от
результата инструкции, выполняющейся в предыдущем такте, то потребуется еще
один такт, дополнительно, для расчета адреса. Это было названо остановка 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



Опубликовал admin
26 Мар, Пятница 2004г.



Программирование для чайников.