allasm.ru

    Меню

 

   Чтобы высчитать адрес в памяти, который нужен инструкции, требуется один такт. Обычно эти вычисления делаются одновременно с выполнение предыдущей инструкции или спаренных инструкций. Но если адрес зависит от результат инструкции, которая выполнялась в предыдущем такте, тогда вам придется подождать дополнительный такт, чтобы получить требуемый адрес. Это называется задержкой AGI.

Пример:

ADD EBX,4 / MOV EAX,[EBX] ; задержка AGI

   Задержку в данном примере можно убрать, если поместить какие-нибудь другие инструкции между 'ADD EBX, 4' и 'MOV EAX, [EBX]' или переписав код следующим образом:

MOV EAX,[EBX+4] / ADD EBX,4

   Также вы можете получить задержку AGI при использовании инструкции, которые используют ESP для адресации, например, PUSH, POP, CALL и RET, если ESP был именен в предыдущем такте такими инструкциями как MOV, ADD и SUB. У PPlain и PMMX есть специальная схема, чтобы предсказывать значение ESP после стековой операции, поэтому у вас не будет задержки AGI при изменении ESP с помощью PUSH, POP или CALL. При использовании 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

   У PPro, PII и PIII нет задержки AGI для чтения из памяти и LEA, но есть задержка при записи в память. Это не очень важно, если только последующий код не должен ждать, пока операция записи не будет выполнена.